在 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),一切顺利。
所以一个快速的建议,总是尝试使用任何软件的升级版本,特别是如果你还在学习过程中。
我有这个功能:
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),一切顺利。
所以一个快速的建议,总是尝试使用任何软件的升级版本,特别是如果你还在学习过程中。