提问者:小点点

C中的动态内存分配?


为什么这行得通?

    #include <iostream>    

    int main()
    {
        std::cout << "Enter a number: ";
        int arraySize;
        std::cin >> arraySize;

        int array[arraySize];

        for(int element : array)
        {
            element = 42;
            std::cout << element << "\n";
        }

        std::cout << "Array size: " << sizeof(array) << "\n";
        std::cout << "Element count: " << sizeof(array)/sizeof(int);

        return 0;
    }

我对C语言中动态存储分配的理解告诉我,需要它的一种情况是,当你不知道在编译时需要分配的内存量时。在这个程序中,显然程序编译时不知道数组大小,但它是动态的,因为它可以随着用户输入的值而变化。

这是一个程序在成功编译后运行(警告和无错误):
g程序. cpp-std=c 11-o程序.exe

输入数字:12
42
42
42
42
42
42
42
42
42
42
42
数组大小:48
元素计数:12

如您所见,使用用户定义的元素数量创建了一个数组,每个元素都成功分配给42个,并证明存在sizeof()运算符。

为什么这不算动态存储分配和编译?


共2个答案

匿名用户

这种可变长度数组(VLA)的声明不是标准的:

int array[arraySize];

此行使用g编译的原因是编译器提供了此功能作为扩展:

ISOC99中允许使用可变长度的自动数组,作为扩展GCC在C90模式和C中接受它们。这些数组与任何其他自动数组一样声明,但长度不是常量表达式。存储在声明点分配,并在包含声明的块范围退出时释放。

匿名用户

您在此行中声明的变量称为可变长度数组:

int array[arraySize];

可变长度数组是C编程语言的一个特性,但它们实际上并不是C的一部分。许多编译器支持可变长度数组作为编译器扩展(例如,这里是可变长度数组的gcc版本的留档),但不能保证它在所有编译器上都有效。