C 这是静态内存分配还是动态内存分配的示例?

C 这是静态内存分配还是动态内存分配的示例?,c,memory-management,dynamic-memory-allocation,static-memory-allocation,C,Memory Management,Dynamic Memory Allocation,Static Memory Allocation,我研究了很多静态和动态内存分配,但仍然存在一个困惑: int n, i, j; printf("Please enter the number of elements you want to enter:\t"); scanf("%d", &n); int a[n]; for (i = 0; i < n; i++) { printf("a[%d] : ", i + 1); scanf("%d", &a[i]); } intn,i,j; printf(“请输

我研究了很多静态和动态内存分配,但仍然存在一个困惑:

int n, i, j;
printf("Please enter the number of elements you want to enter:\t");
scanf("%d", &n);
int a[n];
for (i = 0; i < n; i++)
{
    printf("a[%d] : ", i + 1);
    scanf("%d", &a[i]);
}
intn,i,j;
printf(“请输入要输入的元素数:\t”);
scanf(“%d”和“&n”);
int a[n];
对于(i=0;i

int a[n]
是静态内存分配还是动态内存分配?

int a[n]
是具有自动存储持续时间的可变长度数组

考虑以下演示程序

#include <stdio.h>
#include <string.h>

int main(void) 
{
    const size_t N = 10;

    for ( size_t i = 1; i <= N; i++ )
    {
        char s[i];

        memset( s, '*', sizeof( s ) );

        printf( "%*.*s\n", ( int )i, ( int )i, s );
    }

    return 0;
}

每次将控件传递到循环体时,编译器代码生成的本地数组将创建一个在循环体末尾结束的本地数组。

C标准没有讨论动态分配(或静态分配)。但它确实定义了存储持续时间:静态、自动、线程和分配。它决定了对象(一段数据)的寿命(可用性)

  • 静态在存储持续时间的意义上,表示对象可用于整个程序的执行。文件范围内的变量(“全局”变量)和声明中带有
    static
    的局部变量具有静态存储持续时间

  • Automatic存储持续时间是您的常规局部变量,它们仅在声明它们的块的持续时间内有效(函数,或在
    for
    循环的大括号内)

  • 分配的存储持续时间是指通过
    malloc
    和朋友获得的内存。从(成功)调用
    malloc
    ,直到相应的调用
    free
    ,都可以使用它。这通常被称为动态内存分配,因为它是一种获取内存块的方法,内存块的大小在运行时确定


变量
a
具有自动存储持续时间。然而,它可以被认为是动态的,因为它的长度是在运行时确定的,而不是在编译时确定的。就像分配的存储持续时间一样。

不,它是自动分配的。

你怎么看?您如何定义动态分配?我认为可能是动态内存分配。虽然可以说它是动态的,但由于分配的内存量是在运行时决定的,所以它不是严格意义上的动态分配,它区分静态、自动和动态分配。这一个属于“自动”。@EugeneSh。-为了学究,C区分了存储持续时间-静态、自动和分配(C11中的线程)。这是一个好问题--C中的动态分配几乎总是指
malloc
-函数和堆分配系列,但这绝对不是静态分配,所以你对如何分类感到困惑并不奇怪。因此,是的,这属于第三种类型,“自动分配”。在本例中,
a
是一个可变长度的自动数组。请注意,此数组的实际存储位置取决于实现,C不处理堆栈和堆。
*
**
***
****
*****
******
*******
********
*********
**********