gpt4 book ai didi

c - 使用 const int 定义数组的大小

转载 作者:太空狗 更新时间:2023-10-29 16:44:36 24 4
gpt4 key购买 nike

当我尝试运行它时,它给我一个错误,指出变量 a 中的值不是常量。这对我来说没有意义,因为我明确地将变量 a 设为常量。数组的大小是否必须比这更恒定?意思是,只有 #define a 5,或者将其初始化为 int arr[5] 或使用 malloc?我做的有什么问题吗?

int main{

const int a = 5;
int i;
int arr [a];

for (i = 0; i < 5; i++) {
arr[i] = i * 2;
}

printf("%d", arr[1]);
return 0;
}

最佳答案

在 C 中,const 应该被读取为只读。它没有定义编译时间。

const int a = 5;

此处a不是 C standard 要求的常量表达式:

6.7.9 Initialization
4 All the expressions in an initializer for an object that has static or thread storage duration shall be constant expressions or string literals.

因此错误表明您使用的是 C89/C90 编译器。您可以读取用户输入的 a 并声明一个 variable length array ,这是一个 C99 特性,具有自动存储持续时间。

使用#define 是另一种方式。但它只是一个文本替换,并定义了一个具有自动存储持续时间的数组。这与自己定义 int arr[5]; 相同。

如果你想在动态存储(通常称为“堆”)上分配内存,你必须使用malloc()系列函数,它们在整个程序执行过程中都有生命周期,直到您对其调用 free()

(请注意,const 的这种行为仅存在于 C 中。C++ 在此方面有所不同,但会按您的预期工作)。


如果我在 C89 中编译代码,它会失败:

#include <stdio.h>

int main(){

const int a = 5;
int i;
int arr [a];

for (i = 0; i < 5; i++) {
arr[i] = i * 2;
}

printf("%d", arr[1]);
return 0;
}

$ gcc -Wall -Wextra -std=c89 -pedantic-errors test.c
test.c: In function âmainâ:
test.c:7:4: error: ISO C90 forbids variable length array âarrâ [-Wvla]
int arr [a];
^

因为 C89 不支持 VLA(尽管 gcc 以 an extension 的形式支持它,即使在 C89/C90 中也是如此)。因此,如果您使用的编译器不支持 C99,那么您将无法使用 VLA。例如,visual studio 并不完全支持所有 C99 和 C11 功能。虽然,Visual studio 2015 support most C99 features , VLA 不是其中之一。

但相同的代码在 C99 和 C11 中编译没有任何问题:

$ gcc -Wall -Wextra -std=c99 -pedantic-errors t.c
$ gcc -Wall -Wextra -std=c11 -pedantic-errors t.c

这是因为在 C99 中添加了可变长度数组 (VLA)。请注意,VLA 在 C11 标准中已成为可选的。因此,实现可能不支持 C11 中的 VLA。您需要针对 __STDC_NO_VLA__ 进行测试,以检查您的实现是否不支持 VLA。

来自 6.10.8.3 Conditional feature macros

__STDC_NO_VLA__
The integer constant 1, intended to indicate that the implementation does not support variable length arrays or variably modified types.

我个人不使用 VLA,因为如果数组大小相当大,则无法方便地发现分配失败。例如

size_t size = 8*1024;
int arr[size];

在上面的片段中,如果 arr 分配失败,您直到运行时才会知道。内存分配取决于平台的“足够小”大小是多少。所以在一台机器上,1MB 分配可能成功,而另一台可能失败,更糟糕的是没有办法捕捉到这个失败。

因此,VLA 的使用受到限制,只能用于您知道在给定平台上始终会成功的小型阵列。但在那种情况下,我会简单地硬编码数组大小并处理边界条件。

关于c - 使用 const int 定义数组的大小,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34997660/

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