const char数组*

时间:2009-09-12 17:35:47

标签: c++

我正在编写一个C ++程序,它使用需要一个'const char *'数组的RRD库来实现它们的功能。我以为我可以声明数组,然后初始化数组的每个元素,但更改一个,更改所有元素。显然我错过了一些东西。 这是一个类似于我正在编写的代码的示例(即它表现出相同的问题)。

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;}
        }   

}

任何帮助都将不胜感激。

3 个答案:

答案 0 :(得分:8)

const char*的{​​{3}}方法返回的std::string指向std::string拥有的缓冲区,并且只有在下次调用变异方法时才会保持有效std::string。如果要保留此缓冲区的内容,则需要将其内容复制到其他位置。

编辑或者,您可以保留一个std::string数组来管理字符串的存储,并将c_str()指针暂时存储在{{1}的并行数组中根据接口的要求。这样就不需要复制字符串或手动取消分配副本。在任何情况下,在您持有之前调用const char*返回的std::string值时,不要更改任何const char*非常重要。

答案 1 :(得分:6)

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

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

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

答案 2 :(得分: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[]

处理