字符常量指针数组

5

我正在编写一个使用RRD库的C++程序,该库需要一个'const char*'数组作为其函数的参数。我认为我只需要声明这个数组,然后初始化数组中每个元素,但是更改其中一个元素会更改所有元素。显然我还有些不理解的地方。

以下是一个类似于我编写的代码(即它展现了相同的问题)的示例:

string intToString(long i)
{
    stringstream ss;
    string s;
    ss << i;
    s = ss.str();
    return s;
}

int main(){
        const char* av[5];
        int i = 0;
        int j = 0;
        for(i=0;i<5;i++){
                j= 0;
                av[i] = intToString(i).c_str();
                for(j=0;j<5;j++){ cout << j << " : " << av[j] << endl;}
        }   

}

非常感谢您的帮助。


1
运行此代码会导致VS2008崩溃,因为av [5]未初始化,但在for(j = 0 ...)循环中使用了它。 - quamrana
顺便提一下,在你的intToString函数中,只需要写:return ss.str();。没有必要先复制一份,再返回那个副本。 - GManNickG
3个回答

8
std::stringc_str() 方法返回的 const char* 指向由 std::string 拥有的缓冲区,仅在下一次调用 std::string 的可变方法之前保持有效。如果您想保留此缓冲区的内容,则需要将其内容复制到其他地方。 编辑: 或者,您可以保留一个 std::string 数组来管理字符串的存储,并根据需要在平行的 const char* 数组中临时存储 c_str() 指针以供接口使用。这样可以避免复制字符串或手动释放副本。无论如何,在保持先前调用 c_str() 返回的 const char* 值时不要更改任何 std::string

6

string::c_str返回一个临时指针。您可以使用strdup来获取持久性指针。

// don't forget to release memory later
av[i] = strdup( intToString(i).c_str(); ); 

或者您可以手动分配所有缓冲区,然后使用 string::copy 来复制字符串数据。


1
正确。c_str仅在返回它的字符串有效期内有效。另一种方法是将intToString(i)的返回值存储在数组中:string avs[5]; ... avs[i]=intToString(i); av[i]=avs[i].c_str();(尽管我不认为有必要存储char *)。 - Jonathan Graehl

1

将所有内容汇总,您可以像这样编写程序:

#include <sstream>
#include <iostream>

std::string intToString(long i)
{
    std::stringstream ss;
    std::string s;
    ss << i;
    s = ss.str();
    return s;
}

int main(){
    const char* av[5];   // declared but not initialised
    std::string sav[5];  // std::string has a ctor, so they're initialised
    for(int i=0;i<5;i++){
        av[i]="";    // initialise each const char*
    }

    for(int i=0;i<5;i++){
        sav[i] = intToString(i);  // Keep the original in sav[]
        av[i] = sav[i].c_str();   // point to each string's contents
        for(int j=0;j<5;j++){ std::cout << j << " : " << av[j] << std::endl;}
    }   

}

@Philip:请注意,您的程序在每次重新初始化av[]后都会打印出每个av[]

请注意,内存管理由sav[]处理。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接