下面的代码可以正常工作并给出输出 4:
int main()
{
int *res = valout();
printf("%d", res[0]);
}
int *valout()
{
static int arr[] = {4, 5, 6};
return arr;
}
以下代码返回段错误:
int main()
{
int *res = valout();
printf("%d", res[0]);
}
int *valout()
{
int arr[] = {4, 5, 6};
return arr;
}
为什么我们在案例 2 中得到错误,而不是在案例 1 中? static 关键字在这里起什么作用? 请详细说明这个问题。
最佳答案
因为:
static int arr[] = {4, 5, 6};
创建一个 static
数组(显然),定义为从创建之时起就存在的变量直到程序退出。
另一方面:
int arr[] = {4, 5, 6};
创建一个仅存在于定义它的函数(或 block )的有限范围内的变量。它不再是函数退出时。
在这两种情况下,return arr
返回该数组的第一个元素的地址。不幸的是,对于非static
变体,没有正确的方法使用 该地址,因为它所引用的底层对象已不复存在。因此,它会提示它。
static
版本,一直存在到程序退出,可以在函数退出后使用。
关于c - 为什么分配带有静态关键字的数组和不分配指针的数组有区别?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60913536/