我有这个功能:
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 +的初学者(很容易知道),那么它会工作,所以请明确...
答案 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),一切顺利。 所以一个快速的建议,总是尝试使用任何软件的升级版本,特别是如果你还在学习过程中。