gpt4 book ai didi

c - 为什么不能使静态数组的大小可变?

转载 作者:太空狗 更新时间:2023-10-29 16:40:42 25 4
gpt4 key购买 nike

Related but not quite duplicate as it discusses C++:
can we give size of static array a variable

我在其中一个子文件中定义一个数组,如下所示。

static int arr[siz];

这里的siz是子文件可用的全局变量。但是 gcc 编译器会产生以下错误:

<filename>: <line_num> : error : storage size of ‘arr’ isn’t constant

为什么我不能定义可变大小的 static 数组?

编辑:这似乎只是static int 类型的问题。如果我将 arr 的变量类型从 static int 更改为 int,即使数组的大小仍然取决于一个变量 siz

最佳答案

由于您声明的数组的大小不是常量,因此您拥有的是一个可变长度数组 (VLA)。 VLA 是 c99 标准允许的,但有一些与之相关的限制。您不能使用带有 staticextern 存储类说明符的可变长度数组。

您有一个带有static 存储规范的 VLA,但 C99 标准不允许这样做。

引用:

c99 标准:6.7.5.2/8

EXAMPLE 4 All declarations of variably modified (VM) types have to be at either block scope or function prototype scope. Array objects declared with the static or extern storage class specifier cannot have a variable length array (VLA) type. However, an object declared with the static storage class specifier can have a VM type (that is, a pointer to a VLA type). Finally, all identifiers declared with a VM type have to be ordinary identifiers and cannot, therefore, be members of structures or unions.

因此,如果您想要一个带有 static 存储说明符的动态大小数组,您将不得不使用在堆上分配的动态数组。

#define MAX_SIZE 256
static int* gArr;
gArr = malloc(MAX_SIZE * sizeof(int));

编辑:
要回答您更新后的问题:
当您从声明中删除 static 关键字时,声明数组的存储说明符从 static 更改为全局,请注意上面的标准引用,它清楚地提到了 VLAs 的限制staticextern 存储规范不允许。显然,您可以拥有一个具有全局存储规范的 VLA,这就是您删除 static 关键字后所拥有的。

关于c - 为什么不能使静态数组的大小可变?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10675399/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com