【问题标题】:Why it is possible to generate an array of dynamic size in C?为什么可以在 C 中生成动态大小的数组?
【发布时间】:2018-12-20 15:33:29
【问题描述】:

我写了以下c-coden-p:

#include <stdio.h>

void function(int size){
    int array[size];

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

    }
}

int main(){
    int array_size;
    scanf("%d",&array_size);
    function(array_size);

    return 0;

}

为什么可以通过这种方式生成动态大小的数组。通常我会使用 malloc,但这也可以。为什么数组的大小可以使用非常数变量size?

【问题讨论】:

  • 您没有初始化数组成员。编译器可能会一起忽略/删除它。它被称为未定义的行为
  • 这可能与alloca() 函数的工作方式非常相似。分配数组只需调整当前堆栈指针以为动态大小的数组腾出空间。释放在函数退出时自动发生。

标签: c arrays constants


【解决方案1】:

这就是所谓的可变长度数组”。

自 C99 起就支持变长自动数组

它们像普通数组一样被声明,但长度不是常数,并且在声明时分配存储空间。

更多信息请见@gcc.gnu.org

【讨论】:

  • 但是... VLA 从 C11 开始是可选的。例如,微软仍然不支持它们(但 AFAIK 也未能正确声明所需的编译常量)。所以它得到了 gcc 和 clang 的支持,但如果你想超级安全,你仍然应该小心......
【解决方案2】:

为什么可以通过这种方式生成动态大小的数组?

不,这个

int array[size]; /* this doesn't get stored in heap section */

其中size 是一个运行时整数常量,它不是动态数组,它被称为Variable length array,它是在C99 中引入的。 动态数组只能通过调用malloc()calloc() 来创建,后者从主内存的 部分获取地址。

为什么允许使用非恒定变量大小作为大小 一个数组?

是的,C99 以后 VLA 可以将 size 作为非常量变量。但是你不能改变(调整)VLA 的大小,一旦声明不同于动态数组(可以使用realloc())。

【讨论】:

    猜你喜欢
    • 2021-07-04
    • 2013-11-13
    • 2012-05-27
    • 2011-10-24
    • 1970-01-01
    • 1970-01-01
    • 2011-01-17
    • 1970-01-01
    相关资源
    最近更新 更多