【问题标题】:Is this is an example of static memory allocation or dynamic memory allocation?这是静态内存分配还是动态内存分配的示例?
【发布时间】:2017-12-12 21:30:44
【问题描述】:

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

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] 属于静态内存分配还是动态内存分配?

【问题讨论】:

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

标签: c memory-management dynamic-memory-allocation static-memory-allocation


【解决方案1】:

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

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

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

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

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

【讨论】:

    【解决方案2】:

    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] 的生命周期在循环体的末尾结束。

    【讨论】:

      【解决方案3】:

      不,它属于自动分配

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2013-01-02
        • 1970-01-01
        • 2010-09-30
        • 2011-08-31
        • 2012-01-13
        • 2021-07-14
        • 2016-02-01
        • 2015-07-23
        相关资源
        最近更新 更多