当我必须指定内存大小时,malloc()
-ED数组和常规数组之间有什么区别,例如
char* arr = malloc(50 * sizeof(char))
vs
int arr [50]
好吧,有太多差异。首先,请阅读有关数组不是指针,反之亦然。
也就
-
一个数组的范围仅限于其封闭块,但除非手动进行交易,否则动态分配的记忆将活着。因此,函数本地的数组无法
retrun
ed,但是通过malloc()
-ing返回的指针可以是。 -
对于非VLA情况,数组大小必须是一个编译时间常数,但对于
malloc()
大小,在运行时指定。换句话说,对于数组,您需要在编译时知道大小,而对于malloc()
-ing,可以在运行时确定所需的大小。 -
阵列不能重新尺寸。定义后,他们会使用大小所需的所有内存。OTOH,一个
malloc()
-ED指针,指向一定数量的内存,很可能是realloc()
-ED到其他数量的内存。
主要区别是,可以根据需要调整动态分配的内存;阵列(静态,自动或可变长度)一旦实例化就无法调整大小。
次要差异与数组的 lifetime 有关。在文件范围或static
关键字上声明的数组具有寿命,可以在程序的寿命中延伸。在没有 的函数或块中声明的数组 static
关键字的使用寿命仅限于其封闭范围的范围(这就是为什么您无法将指针从函数 - 函数 - 当功能退出时,数组停止存在)。
动态内存落在两者之间的某个位置 - 其寿命从初始*alloc
调用延伸到free
调用,该调用可能处于不同的功能。您直接控制其寿命。
由于如何对auto
(本地)变量管理内存,自动和可变长度数组通常不能任意大 - 尝试创建比大左右的本地阵列可以导致一个大左右的局部数组流行平台上的运行时错误。通常,您对动态分配的内存没有这种限制。
,因为在数组大小中应在编译时可用,同时使用指针,让您在运行时确定其大小。
来自此链接:
动态内存分配允许您的程序在运行时获得更多的内存空间,或者在不需要的情况下发布。
简单地说,动态内存分配允许您手动处理程序的内存空间。
在这里您还可以阅读,在静态分配中,所需的内存由编译器分配,并且必须在编译时知道确切的大小和类型。另一方面,在动态内存分配中,在运行时间内分配了"飞行"的内存,并且动态分配的空间通常放置在称为Heap或Free Store的程序段中。
使用malloc
您使用的大小可以是一个变量!这意味着在执行到达malloc
语句之前,大小可能会变化。指定已声明数组的大小,否则必须是恒定的。
int foo = 5;
char bar[foo]; // This will cause a compile error
char bar[5]; // size is fixed, array size specifiers MUST be constant in C
void some_func (void)
{
// do some work that might change foo, e.g. get a value from user
char* arr = malloc(foo * sizeof(char)); //foo is variable, thus the size is variable!
}
请注意,您说您已经使用malloc
创建一个数组。这是不正确的。malloc
仅分配了一些连续的内存,并为您提供了一个指向该内存开始的指针 - 从技术上讲,这是而不是作为数组的某些东西(可以像很多情况下,但不是所有情况)