【问题标题】:Static array in C [duplicate]C中的静态数组[重复]
【发布时间】:2014-12-31 09:53:25
【问题描述】:

我一直都知道,如果不使用mallocfree,就无法在C语言中构建动态数组,那么为什么这段代码编译运行正常呢?

#include <stdio.h>
#include <stdlib.h>


int main()
{
    int a;
    printf("Insert a number: ");
    scanf("%d", &a);

    int array[a];
    int i;
    for(i=0; i<a; i++)
    {
        array[i] = rand();
    }

    for(i=0; i<a; i++)
    {
        printf("%d\t", array[i]);
    }
    puts("");
    return 0;
}

我知道这不是一个真正的动态数组,因为在声明后无法更改“数组”的大小,也无法通过调用free() 来释放它,但我仍然认为静态数组必须在编译时知道,这显然不是这里的情况..

【问题讨论】:

  • 它被称为 VLA(可变长度数组)。它是在 C99 中引入的
  • 是什么让你认为它是一个静态数组?我在任何地方都看不到“静态”关键字。正如 Cool Guy 所解释的那样,“你一直都知道的事情”并不总是真实的事情。
  • 据我所知,“静态数组”是指在 main() 执行之前分配的数组,这是您在代码中使用的每个固定大小数组的情况
  • @user2318607 : 数组array[] 未分配 main 执行之前,并非每个固定大小的数组 . static 存储类说明符不是 dynamic相反。在这种情况下,array[] 具有 auto 存储类 - 它在进入它所在的函数的入口时分配在堆栈上。在这种情况下,因为它在函数 main() 中,它恰好具有与 static相似 生命周期。
  • @CoolGuy :您确实应该将答案发布为答案而不是 cmets。这显然是一个答案。

标签: c arrays variable-length-array


【解决方案1】:

您使用的是variable length array。 C99 及更高版本支持。但请注意,与malloc 系列函数分配的动态内存不同,VLA 具有自动存储持续时间。

还要注意编译时分配不等于static 数组。 static数组和静态分配不同。

【讨论】:

  • 但请注意,它的作用域仅限于声明它的函数,这与动态分配不同。您正在混合词法作用域和存储持续时间。
猜你喜欢
  • 1970-01-01
  • 2015-04-16
  • 2017-08-26
  • 1970-01-01
  • 2013-12-23
  • 2021-02-08
  • 1970-01-01
  • 2013-08-24
  • 2021-07-22
相关资源
最近更新 更多