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

Error returning char* in c++ function

我有这个功能:

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 而它不在 codeblocks v. 13.12(分段错误)中;如果我将我的 char buffer[]= 声明更改为 char *buffer=; 它会起作用我是 C++ 的初学者(很容易知道)所以请清楚...

这个:

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

将字符串 "Hi world!" 复制到局部变量 buffer 中,然后 return 复制该局部变量 - 如果您尝试使用该 return 这会导致未定义的行为值,因为缓冲区在函数退出时被丢弃。

这个:

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

实际上还可以,尽管可能不是您想要的。你会 returning 字符串文字的开始地址(存储在一个神秘的地方,重新标准),这是 OK.In C++,你会遇到 const 问题。

只需将函数return_string改成下面的方式

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

原函数实现的问题是数组buffer是函数的局部数组,自动保存时长,退出函数后不会存活

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

函数test08可以写得更简单

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

您的函数 return_string 是 return 指向仅在 return_string 范围内定义的局部变量 buffer 的指针。当函数 returns 时,您 return 曾经存储 buffer 的地址,而存储在该地址中的值不再有效。 好吧,如果你坚持 return 指向字符的指针,你可以动态分配 "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);
}

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

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

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