在 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 中运行,而在代码块中没有。 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),一切顺利。因此,一个快速的建议是,始终尝试使用任何软件的升级版本,特别是如果您仍在学习过程中。