在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运营商说:

¶2sizeof运算符产生其操作数的大小(以字节为单位),该操作数可以是表达式或类型的括号名称。大小由操作数的类型确定。结果是一个整数。如果操作数的类型是可变长度数组类型,则对操作数求值;否则,不对操作数求值,结果为整数常量。

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

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要初始化的实体的类型应为未知大小的数组或不是可变长度数组类型的完整对象类型。

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

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

如何在C中声明一个可变大小的数组?

来自分类Dev

如何在C中声明一个可变大小的数组?

来自分类Dev

C中的可变长度数组和静态声明

来自分类Dev

在C ++中声明一个指针数组

来自分类Dev

在C ++中声明一个指针数组

来自分类Dev

我如何在C ++中声明一个不可变的类(Java示例)

来自分类Dev

在 C++ 中创建一个可变大小的数组

来自分类Dev

在一个用十六进制值填充的C char数组中,长度是多少?

来自分类Dev

创建一个函数以返回C中int数组的长度

来自分类Dev

如何声明一个字符串,以便它的长度由用户在c中给出?

来自分类Dev

在for循环中为数组长度声明一个变量

来自分类Dev

如何检查可变长度数组中的任何字符串是否存在于另一个字符串中?

来自分类Dev

在C中的堆栈上声明一个数组(VS2015)

来自分类Dev

在C ++中动态声明一个指向对象的指针数组

来自分类Dev

如何在C中声明一个元素数组

来自分类Dev

在C中声明并初始化一个新的char数组后,将更改varible

来自分类Dev

C++:在类中声明一个指向数组的指针?

来自分类Dev

在Realm Swift中声明一个Int数组

来自分类Dev

从数组Perl中的grep声明一个变量

来自分类Dev

在VB.net中声明一个公共数组

来自分类Dev

声明一个新的长数组C ++

来自分类Dev

声明可变长度数组的分配

来自分类Dev

这是C ++中“可变”的一个好用例吗?

来自分类常见问题

在PostgreSQL中,如何声明一个接受不同类型参数的可变参数函数?

来自分类Dev

在for循环中创建一个长度可变的列表

来自分类Dev

我需要一个边框长度可变的圆圈

来自分类Dev

创建一个未知长度的数组

来自分类Dev

你怎么能在 C 中获得一个未格式化的可变长度字符串中的所有浮点数?

来自分类Dev

在Rails上声明一个可变的红宝石

Related 相关文章

  1. 1

    如何在C中声明一个可变大小的数组?

  2. 2

    如何在C中声明一个可变大小的数组?

  3. 3

    C中的可变长度数组和静态声明

  4. 4

    在C ++中声明一个指针数组

  5. 5

    在C ++中声明一个指针数组

  6. 6

    我如何在C ++中声明一个不可变的类(Java示例)

  7. 7

    在 C++ 中创建一个可变大小的数组

  8. 8

    在一个用十六进制值填充的C char数组中,长度是多少?

  9. 9

    创建一个函数以返回C中int数组的长度

  10. 10

    如何声明一个字符串,以便它的长度由用户在c中给出?

  11. 11

    在for循环中为数组长度声明一个变量

  12. 12

    如何检查可变长度数组中的任何字符串是否存在于另一个字符串中?

  13. 13

    在C中的堆栈上声明一个数组(VS2015)

  14. 14

    在C ++中动态声明一个指向对象的指针数组

  15. 15

    如何在C中声明一个元素数组

  16. 16

    在C中声明并初始化一个新的char数组后,将更改varible

  17. 17

    C++:在类中声明一个指向数组的指针?

  18. 18

    在Realm Swift中声明一个Int数组

  19. 19

    从数组Perl中的grep声明一个变量

  20. 20

    在VB.net中声明一个公共数组

  21. 21

    声明一个新的长数组C ++

  22. 22

    声明可变长度数组的分配

  23. 23

    这是C ++中“可变”的一个好用例吗?

  24. 24

    在PostgreSQL中,如何声明一个接受不同类型参数的可变参数函数?

  25. 25

    在for循环中创建一个长度可变的列表

  26. 26

    我需要一个边框长度可变的圆圈

  27. 27

    创建一个未知长度的数组

  28. 28

    你怎么能在 C 中获得一个未格式化的可变长度字符串中的所有浮点数?

  29. 29

    在Rails上声明一个可变的红宝石

热门标签

归档