打印函数返回的字符串。我这里有两个案例,一个是返回指向字符串的指针,另一个是char数组[duplicate]

问题描述 投票:1回答:2

这个问题在这里已有答案:

我有两种情况返回字符串。一个返回一个指针,另一个返回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 arrays pointers
2个回答
1
投票

在C中,本地数组(如第二个示例中的str)默认存储在内存的堆栈部分中。这意味着,一旦str返回,存储voice()的内存部分就变得无法访问,因此当您尝试访问无法访问的内存时会产生分段错误。

字符串文字(如"hey")存储在内存的代码部分中。即使voice()返回,字符串仍然存储在内存的代码段中。


3
投票

第二种情况不起作用,因为您返回本地数组的地址。

局部数组“str”的范围仅限于该函数。因此该数组仅在该函数内有效。一旦退出该功能,它将变为无效。在这种情况下,程序的行为将是不确定的。

在第一种情况下,您将返回字符串常量的地址。字符串常量分配在单独的内存空间中,它们将在整个程序中保留。因此,即使从voice()返回,字符串的地址仍然有效。

© www.soinside.com 2019 - 2024. All rights reserved.