我正在C ++ 17项目中工作,但必须使用C-legacy-library。为此,我必须创建一个C风格的const char *数组,但是我在初始化时遇到了麻烦。特别是
#include <iostream>
int main(int argc, char* argv[])
{
const int bound = 3;
const char* inames[bound]{ "" };
for(unsigned int i = 0; i < bound; i++) {
const char *number = std::to_string(i).c_str();
inames[i] = number;
}
for(unsigned int i = 0; i < bound; i++) {
std::cout << "inames["
<< std::to_string(i)
<< "] = "
<< inames[i]
<< std::endl;
}
return 0;
}
返回
inames[0] = 2
inames[1] = 2
inames[2] = 2
作为输出,我并不理解。我希望输出是
inames[0] = 0
inames[1] = 1
inames[2] = 2
有人可以帮我指出我的错误吗?
答案 0 :(得分:5)
您的代码具有未定义的行为。
std::to_string(i).c_str()
您正在创建一个临时std::string
实例,然后获取其内部const char*
指针。在该行的末尾,临时实例已死,因此指针现在悬空了。
答案 1 :(得分:1)
问题是您没有任何地方可以实际存储字符串本身,而只存储指向它们的指针。
通过这种方式,将字符串存储在std :: strings中,同时被纯C数组引用:
const int bound = 3;
std::vector<std::string> strings(bound);
const char* inames[bound];
for (unsigned int i = 0; i < bound; i++) {
strings[i] = std::to_string(i);
inames[i] = strings[i].c_str();
}