奇怪的 C 数组声明

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

所以我发现了 C 数组声明的一个奇怪的问题。我尝试了两种不同的方式在 C 中声明数组(并没有真正不同)。两者似乎工作原理相同,但我的老师说我使用的那个是错误的。

在课堂上我的老师教我像这样声明一个数组

#include <stdio.h>
#define SIZE 5

int main() {
    int arr[SIZE] = { 1, 2, 3 ,4 ,5 };
    return 0;
}

但是当我做练习时我会这样做

#include <stdio.h>

int main() {
    int size = 0;
    printf("Input size: ");
    scanf("%d", &size);

    int arr[size];
    
    for (int i = 0; i<size; i++)
    {
        arr[i] = i;
    }
    
    for (int i = 0; i<size; i++)
    {
        printf("%d", arr[i]);
    }
    
    return 0;
}

错误显示在问题选项卡中:

“表达式必须具有常量值”

但我仍然运行它,结果仍然正确显示。 谁能解释一下为什么会出现这种情况?

c
1个回答
0
投票

两者都不是“错误”。前者是“经典”静态大小数组,后者是可变长度数组(VLA)。两者一旦声明就无法调整大小,并且很可能都会在堆栈上分配。

使用 VLA 存在一些问题,因为像这里一样使用它们时,我们确实必须首先清理程序输入以检查输入的大小是否合理,否则我们将面临堆栈溢出的风险。但他们并没有“错”。

如果您收到警告,那么您似乎正在使用严重过时的编译器,因为 VLA 自 1999 年以来一直采用 C 语言。

如果你的老师还不知道所有这些,或者强迫你使用 20 世纪 80 年代的编译器(Borland Turbo?),那么他们就非常无能,不应该教授编程。

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