这个问题在这里已有答案:
我有两种情况返回字符串。一个返回一个指针,另一个返回char数组。第一种情况在打印字符串时工作正常,但我在第二种情况下遇到了分段错误错误。我想知道为什么会这样吗?
This is the first case, and it gives the output.
char* voice(void){
return "hey!";
}
int main(){
printf ("%s\n", voice()); //output: hey!
return 0;
}
This is the second case, and it gives a segmentation fault.
char* voice(void){
char str[] = "hey!";
return str;
}
int main(){
printf ("%s\n", voice()); //segmentation fault
return 0;
}
在C中,本地数组(如第二个示例中的str
)默认存储在内存的堆栈部分中。这意味着,一旦str
返回,存储voice()
的内存部分就变得无法访问,因此当您尝试访问无法访问的内存时会产生分段错误。
字符串文字(如"hey"
)存储在内存的代码部分中。即使voice()
返回,字符串仍然存储在内存的代码段中。
第二种情况不起作用,因为您返回本地数组的地址。
局部数组“str”的范围仅限于该函数。因此该数组仅在该函数内有效。一旦退出该功能,它将变为无效。在这种情况下,程序的行为将是不确定的。
在第一种情况下,您将返回字符串常量的地址。字符串常量分配在单独的内存空间中,它们将在整个程序中保留。因此,即使从voice()返回,字符串的地址仍然有效。