这是静态内存分配还是动态内存分配的一个例子?

时间:2017-12-12 21:30:44

标签: 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]);
}

int a[n]是否属于静态或动态内存分配?

3 个答案:

答案 0 :(得分:13)

C标准没有讨论动态分配(或静态分配,就此而言)。但它确实定义了存储持续时间:静态,自动,线程和已分配。这决定了一个对象(一段数据)存在多长时间(可用)。

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

  • 自动存储持续时间是您的常规局部变量,它们仅在声明它们的块的持续时间内存在(函数,或者在例如{{1}的花括号内})循环)。

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

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

答案 1 :(得分:3)

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;
}

它的输出是

*
**
***
****
*****
******
*******
********
*********
**********

每次将控件传递给循环体时,编译器代码生成的本地数组s[n]的生命周期结束于循环体的末尾。

答案 2 :(得分:1)

不,这是自动分配

相关问题