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

Error returning char* in c++ function

本文关键字:出错 char 返回 c++ 函数      更新时间:2023-10-16

我有这个功能:

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++的初学者(很容易知道),它会起作用,所以请清楚...

只需按

以下方式更改函数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;
}

这个:

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

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

这:

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

实际上没问题,尽管可能不是您想要的。您将返回字符串文本开头的地址(存储在一个神秘的地方,re标准),这是 OK.In C++,您将遇到 const 问题。

您的函数return_string返回指向仅在 return_string 范围内定义的局部变量buffer的指针。当函数返回时,您将返回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);
}

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

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

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