初始化const char *数组

时间:2018-09-13 13:38:52

标签: c++ arrays string

我正在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

有人可以帮我指出我的错误吗?

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