【问题标题】:Dynamic vs static/automatic memory allocation in C [duplicate]C中的动态与静态/自动内存分配[重复]
【发布时间】:2016-12-25 14:22:17
【问题描述】:

在 SO 上有很多关于这一切的帖子,我明白当使用动态内存分配指针时,指针超出了它们被创建的函数。但我似乎仍然对编译与运行时部分有点困惑.

例如当在运行时第一次知道数组的大小时,似乎规则是您需要使用动态内存分配。但以下在运行时工作得很好:

int main(int argc, char *argv[])
{

  char * elems = argv[1];
  int intelems = atoi(elems);
  int array[intelems];


  for (int i=0; i<intelems; i++) {
     array[i] = 42 + i;
  }

  for (int i=0; i<intelems; i++) {
     printf("%d\n", array[i]);
  }

  return 0;

}

所以我编译了上面的程序之后,我可以在运行程序时指定我需要的任何大小的数组。

在上面的示例中必须进行哪些更改才能更清楚地表明除非我为数组动态分配内存,否则它将无法工作?

【问题讨论】:

  • 以上不是动态内存,而是数组的存储时长。您的数组具有可变长度,但它仍然具有自动存储持续时间。如果您要使用malloc,它将具有已分配 存储持续时间。

标签: c arrays memory-management


【解决方案1】:

当数组的大小在运行时第一次知道时,似乎规则是您需要使用动态内存分配。

曾经是规则,但现代 C 有Variable Length Arrays。所以上面的例子是有效的。

如果大小可能太大而导致堆栈溢出,您仍然需要动态分配。

如果您希望数组存在于创建它的函数范围之外,您仍然需要动态分配。

【讨论】:

  • 好的,这样就可以归结为仅当数组需要比创建它的函数寿命更长或者它真的很大时才使用 malloc。这似乎是边缘情况,所以这是否意味着它不是通常看到 malloc 在现代 C 程序中使用?
  • 那些不是极端情况。这两个都是正常的日常案例。对于新手程序员来说,它们可能看起来像边缘案例。
【解决方案2】:

您使用可变长度(自动)数组,添加了更高版本的 C(因为我有旧版本的 C,其他人可能能够更好地解释它)。

请注意,数组的大小是在声明数组之前声明(并且已知)的:

char * elems = argv[1];
int intelems = atoi(elems);
int array[intelems];

编译器现在插入汇编代码以在堆栈上为数组保留空间,类似于(伪汇编):

add sp, intelems*sizeof_int

【讨论】:

  • c99 快 20 岁了。我发誓人们会在十年后称它为“新”,仍然
  • @StoryTeller,说出了我的年龄...:-)
  • @StoryTeller 告诉微软。
  • @n.m. - 正是出于这个原因,微软在我个人的耻辱墙上。感谢天堂clang-cl
  • ...我只是习惯于在 VC 中查找所有内容,否则我早就改变了。
猜你喜欢
  • 2015-02-27
  • 2018-10-01
  • 2015-07-23
  • 2016-02-01
  • 1970-01-01
  • 2020-12-05
  • 2021-09-20
  • 1970-01-01
  • 2021-04-01
相关资源
最近更新 更多