我正在编写一个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;}
}
}
任何帮助都将不胜感激。
答案 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[]