当我必须指定内存大小时,malloc数组和常规数组之间有什么区别?

Yas*_*imi 1 c arrays malloc dynamic-memory-allocation

malloc()例如,当我必须指定内存大小时,-ed数组和常规数组之间的区别是什么

char* arr =  malloc(50 * sizeof(char)) 
Run Code Online (Sandbox Code Playgroud)

VS

int arr [50]
Run Code Online (Sandbox Code Playgroud)

Sou*_*osh 5

嗯,差异太大了.首先,阅读有关数组不是指针,反之亦然.

也就是说,与可用性的观点有三个主要区别(我觉得你感兴趣)

  • 数组的范围仅限于其封闭块,但动态分配的内存存活,除非手动取消分配.因此,函数本地的数组不能被retrun编辑,但是通过malloc()-ing 返回的指针可以是.

  • 对于非VLA情况,数组大小必须是编译时常量,但是malloc()在运行时指定大小.换句话说,对于数组,您需要在编译时知道大小,而对于malloc()-ing,完全可以在运行时确定所请求的大小.

  • 数组不能重新调整大小.一旦定义,它们就会使用其大小所需的所有内存.OTOH,一个malloc()指向一定数量内存的指针,可以realloc()根据需要很好地用于其他一些内存.

  • 此外,可以通过检查来自`malloc()`等的返回值来检测分配失败,但是无法分配静态数组或VLA是不可检测的AFAIK. (2认同)