不使用malloc创建动态数组

时间:2016-01-24 11:44:51

标签: c c99

我惊讶地发现这段代码正常运行。我无法弄清楚为什么

#include<stdio.h>
int main(){
  int row,col,i,j;
  scanf("%d %d",&row,&col);
  int a[row][col];
  for(i=0;i<row;i++)
      for(j=0;j<col;j++)
           scanf("%d",&a[i][j]);
   for(i=0;i<row;i++){
      for(j=0;j<col;j++)
           printf("%d ",a[i][j]);
       printf("\n");
   }
}

由于C是一种编译语言,那么如何为数组a [row] [col]分配内存?由于在编译时行和列的值是未知的,那么它如何能够为程序制作机器代码并设置地址空间?为什么这可以作为解释器语言工作,如果这是一种创建动态数组的方法,那么为什么我们教会使用 malloc在C中创建动态数组。

2 个答案:

答案 0 :(得分:3)

自C99以来,可变长度数组一直是C的标准特性。

  

如何为数组BeautifulSoup

分配内存

一旦a[row][col]row的值已知,编译代码就可以在自动存储区域(通常称为“堆栈”)中进行此分配。 / p>

  

如何制作机器代码并为程序设置地址空间?

编译器将colrow的值清除,以供其生成的机器代码内部使用。引用col的指令查找大小,进行数学运算,添加偏移量并获取地址,就好像编译时已知a[i][j]row一样。

该功能确实改变了一些其他的东西 - 例如,col不再是纯粹的编译时操作,因为需要在运行时计算VLA的大小。

  

为什么我们教会使用sizeof在C中创建动态数组。

malloc为您提供比VLA更多的灵活性。例如,您可以从函数返回一个malloc - 创建的数组,而一旦函数完成,VLA就会自动解除分配。此外,malloc不太可能使程序内存不足,因为动态存储区域的大小比自动存储区域大。

例如,如果您尝试为程序输入malloc 2000,则可能会崩溃。然而,使用2000分配相同数量的内存是没有问题的:

malloc

答案 1 :(得分:0)

That's feature of C99。无论如何使用malloc的原因是它分配的空间不在堆栈上,而是堆 - 而堆也是重的“#”。应该存储数据,因为堆栈空间受到严格限制。比那更多的;无法进行堆栈分配通常会导致程序崩溃 - 而使用malloc分配会返回一个NULL指针,这样您就可以优雅地进行操作。