【问题标题】:What is the difference between static and dynamic arrays in C? [duplicate]C中的静态数组和动态数组有什么区别? [复制]
【发布时间】:2012-09-14 17:14:27
【问题描述】:

可能重复:
Is array name a pointer in C?
C++ Static array vs. Dynamic array?

我正在学习 C,但我对以下两个数组之间的区别感到困惑:

int a[10];

int *b = (int *) malloc(10 * sizeof(int));

只是在最基本的层面上,这两者有什么区别?

【问题讨论】:

  • 请注意,int a[10]; 仅在声明位于文件范围内时才声明 静态 数组。
  • @DanielFischer 你是什么意思?你是说如果我在函数中有那一行,它就不会被称为 static 或者它不会做我想要的?
  • 在一个函数中,它声明了一个自动存储持续时间的本地数组,而不是静态存储持续时间的数组(static int a[10]; 将在块/函数范围内声明一个静态存储持续时间的数组)。我认为你被malloced 对象的常见误称“动态数组”误导了,static 的技术含义不是上述意义上的“动态”的补充。
  • @DanielFischer 好的,这只是一个术语。谢谢

标签: c arrays


【解决方案1】:
int a[10];

在堆栈上分配,并在作用域结束后立即释放。

int *b = (int *) malloc(10 * sizeof(int));

在堆上分配,并且在程序的整个生命周期内都是活动的,除非它明确地freed。

【讨论】:

  • 但是如果我将int a[10] 声明为全局变量呢?那么它有什么不同吗?
  • 全局变量在整个程序中都是有效的。但请注意,这并不等同于 malloc'ing 变量。
  • @Zboson alloca 既不是 ISO C 也不是 POSIX 的一部分。除非我没有其他选择,否则我会避免使用此类功能。
  • @Zboson “堆栈”一词可能会引起一些混乱。 C 定义基于存储持续时间:1) 自动存储 - 局部变量、数组等 2) 静态存储 - 全局变量、数组、任何变量 static 限定符等。VLA 是分配在“堆栈”(自动)还是“堆”上"(动态)是一个实现细节。因此,应将 VLA 视为“堆栈”分配的变量。
  • @Zboson 同意这个答案有点误导。我在那里添加了评论。希望回答者会编辑它,或者至少它会作为对未来读者的警告。
【解决方案2】:

一旦您离开当前堆栈帧(基本上,当您所在的函数返回时),静态数组就会被销毁。动态数组会一直存在,直到你 free() 它。

【讨论】:

  • 所以如果我在一个方法中做了:int a[10]; int *ptr = &a; 然后返回了ptr 那么ptr 在这个方法返回后会指向垃圾吗?
  • @JoeyFranklin 不一定是垃圾。它可能仍然指向同一个地址并且似乎可以工作。但这是一种未定义的行为,这意味着它可能会在稍后的某个时候崩溃。
【解决方案3】:

第一个存在于堆栈上(= 与变量的作用域一样长),第二个存在于堆上(= 存在直到被释放)。第一个具有固定大小,而第二个可以调整大小。

【讨论】:

    猜你喜欢
    • 2013-03-17
    • 2019-09-27
    • 2014-10-08
    • 2021-02-08
    • 2011-01-21
    • 2018-01-26
    • 1970-01-01
    • 2020-09-18
    • 2016-10-21
    相关资源
    最近更新 更多