相同的地址,但内容不同

时间:2015-12-24 01:52:14

标签: c++ string pointers const

我使用stringstream来获取文本文件的内容(实际上,它是着色器代码源),以便将它传递给一个带有const char * const *的函数(glShaderSource) 。起初,我做了那个

std::stringstream buffer;
buffer << input.rdbuf();

char const *code = buffer.str().c_str();
glShaderSource(id, 1, &code, 0);

它没有用,因为代码的内容不是预期的。实际上,如果我这样做:

std::stringstream buffer;
buffer << input.rdbuf();

char const *code = buffer.str().c_str();

printf("Code*: %p\n", code);
printf("Buff*: %p\n", buffer.str().c_str());

printf("Code0: %c\n", code[0]); // ERROR: prints garbage.
printf("Buff0: %c\n", buffer.str().c_str()[0]);

printf("Code1*: %p\n", &code[1]); // ERROR: prints garbage.
printf("Buff1*: %p\n", &buffer.str().c_str()[1]);

printf("Code1: %c\n", code[1]);
printf("Buff1: %c\n", buffer.str().c_str()[1]);

我得到指针值的相同输出,缓冲区中字符的正确输出,但代码的内容是随机输出。

现在,如果我使用这样的函数:

void workaround(char const *code) {
    printf("Code*: %p\n", code);
    printf("Code: %s\n", code);
}

-------------------------------------

std::stringstream buffer;
buffer << input.rdbuf();

workaround(buffer.str().c_str());

printf("Buff*: %p\n", buffer.str().c_str());
printf("Buff: %s\n", buffer.str().c_str());

我得到了指针和字符串内容的正确值。

为什么这段代码有效而不是第一个?

1 个答案:

答案 0 :(得分:2)

我发现了问题:std :: stringstream返回的字符串是临时的,只有在表达式结束时才有效。

要扩展buffer.str()的有效期,可以在对象上创建引用。该值的预期寿命将扩展到参考值之一。

以下代码有效:

std::string const &string = buffer.str();
char const *code = string.c_str();
glShaderSource(id, 1, &code, 0);