繁体   English   中英

在 C 中声明一个可变长度的数组

[英]Declaring an array with variable length in C

我知道在 C 中定义一个数组对于可变长度是不可能的,但是仅仅声明它呢?

#include <stdio.h>

int main ()
{
  int num = 5;
  int array[num];
  printf("%d\n",sizeof(array));
  return 0;
}

上面的代码编译并打印20 它是未定义的行为吗?

编辑1:

如果我写

  int array[num] = {0};

我会得到error: variable-sized object may not be initialized

编辑2:

#include <stdio.h>

void change(int *in){
  *in = 6;
}

int main ()
{
  int num = 5;
  change(&num);
  int array[num];
  printf("%d\n",sizeof(array));
  return 0;
}

gcc test.c

上面打印24是正确的。 编译器如何在编译时知道正确的大小?

代码是干净的 C99 代码。 C99 增加了对 VLA(可变长度数组)的支持。 C11 使支持成为可选的。 您的代码编译干净,除了printf()应该使用%zu而不是%d来打印sizeof()的值。

C11 §6.5.3.4 sizeof_Alignof运算符说:

¶2 sizeof运算符产生其操作数的大小(以字节为单位),它可以是表达式或类型的括号名称。 大小由操作数的类型决定。 结果是 integer。 如果操作数的类型是变长数组类型,则计算操作数; 否则,不计算操作数,结果为 integer 常量。

在您的代码中,大小是在运行时评估的。 你可以有如下代码:

printf("Enter the array size: ");
if (scanf("%d", &n) != 1 || n <= 0 || n > 1024)
{
    fprintf(stderr, "Did not get a valid size\n");
    exit(EXIT_FAILURE);
}

int array[n];

然后打印尺寸仍然是正确的——尺寸是在运行时计算(评估)的。 但这仅适用于 VLA。

VLA 可能没有被初始化——标准也很清楚——第 6.7.9 节初始化说:

¶3 要初始化的实体的类型应该是一个未知大小的数组或一个完整的 object 类型,它不是可变长度数组类型。

您不能为 VLA 编写初始化程序。 那是一个“约束”; 编译器必须抱怨滥用标准。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM