C中的动态与静态/自动内存分配

时间:2016-12-25 14:22:18

标签: c arrays memory-management

有一大堆关于这一切的帖子都已经准备就绪了,我确实理解当使用动态内存分配指针超出它们创建的函数时。但我似乎对编译与运行时部分有点混淆

E.g。当在运行时首先知道数组的大小时,似乎规则是你需要使用动态内存分配。但是下面的代码在运行时运行良好:

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;

}

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

除非我为数组动态分配内存,否则在上面的示例中需要更改哪些内容以使其更加清晰无法工作?

2 个答案:

答案 0 :(得分:3)

  

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

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

如果大小可能会导致堆栈溢出,那么仍需要动态分配。

如果您希望阵列超出创建它的函数的范围,您仍然需要动态分配。

答案 1 :(得分:1)

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

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

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

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

add sp, intelems*sizeof_int