在c ++函数中返回char *时出错

时间:2017-01-14 23:58:11

标签: c++ string buffer string-literals

我有这个功能:

char* return_string(){
    char buffer[] = "Hi world!";
    return buffer;
}

bool test08()
{
    char compare[] = "Hi world!";
    int result = strcmp(compare,return_string());
if (result == 0) return true;
return false;
}
int main()
{
if(test08) printf("\nTRUE");
else printf("\nFALSE");
}

为什么此代码在c++ Shell中运行,而且在代码块v.13.12中没有(分段错误);如果我将char buffer[]=声明更改为char *buffer=;我是C +的初学者(很容易知道),那么它会工作,所以请明确...

5 个答案:

答案 0 :(得分:1)

此:

char* return_string(){
    char buffer[] = "Hi world!";
    return buffer;
}

复制字符串“Hi world!”进入局部变量buffer,然后返回该局部变量 - 如果您尝试使用该返回值,则会导致未定义的行为,因为缓冲区在函数退出时被丢弃。

此:

   char* return_string(){
       char *buffer = "Hi world!";
        return buffer;
   }

实际上可以,但可能不是你想要的。你将返回一个字符串文字的起始地址(存储在一个神秘的地方,重新标准),这是好的。在C ++中,你会遇到const问题。

答案 1 :(得分:1)

只需按以下方式更改功能return_string

const char* return_string(){
    const char *buffer = "Hi world!";
    return buffer;
}

原始函数实现的问题是数组buffer是函数的本地数组,其自动存储持续时间在退出函数后将不会存活。

在修改后的函数中,使用了具有静态存储持续时间的字符串文字。因此,您可以返回指向字符串文字的第一个字符的指针。

函数test08可以写得更简单

bool test08()
{
    char compare[] = "Hi world!";
    return strcmp( compare, return_string() ) == 0;
}

答案 2 :(得分:1)

您的函数return_string返回指向仅在buffer范围内定义的局部变量return_string的指针。当函数返回时,您返回存储在该地址中的值不再有效时用于存储buffer的地址。 好吧,如果你坚持要返回一个指向字符的指针,你可以动态地分配" Hello World"并且请记得稍后释放

char * return_string() {
    char local_var[] = "hello world";
    char *buffer = (char *) malloc(sizeof(local_var));
    strcpy(buffer, local_var); // we know that buffer is big enough to hold local_var
    return buffer;
}

因为" hello world"存储不是函数的本地存储,当函数退出时不会被释放。

另一个(更好的)解决方案是将静态分配的buffer(希望足够大以保持您的价值)传递给return_string并修改其内容。

void return_string(char *buffer, size_t buffer_size) {
    strncpy(buffer, "hello world", buffer_size);
}

答案 3 :(得分:0)

您正在返回指向缓冲区的指针,但缓冲区变量在函数返回后被销毁。

您需要将缓冲区变量设为静态。

答案 4 :(得分:0)

这是一个答案,但仍然...... 我已经尝试过CodeBlocks 16.01(mingw),一切顺利。 所以一个快速的建议,总是尝试使用任何软件的升级版本,特别是如果你还在学习过程中。