c - 为什么分配带有静态关键字的数组和不分配指针的数组有区别?

标签 c arrays pointers

下面的代码可以正常工作并给出输出 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/

相关文章:

c - 阵列也存储在磁盘中还是仅存储在内存中?

php array_search 具有多个命中的单个数组

c++ - this[0] 在 C++ 中安全吗?

c - 使用大括号将数据分配给数组

c - popen 实现中的段错误

c - 如何在 c 中使用 execl() 函数在文件中打印 stderr 消息

将整数转换为数字数组 [C]

c - 如何从命令行正确传递文件路径?

c - 如何将 char* 指针分配给 c 中的 char 变量

c++ - 我可以在不使用 "new"(和隐式指针)的情况下创建在 C++ 堆上分配的对象吗?