2017-03-03 40 views

回答

5

嗯,有太多的差异。首先,阅读有关arrays are not pointers and vice versa。从可用性来看

这就是说,三大差别(我觉得你有兴趣了解

  • 数组限制了它的封闭块一个范围,但动态除非手动解除分配,否则分配的记忆将会生效因此,函数的本地数组不能是retrun ed,但是通过malloc() -ing返回的指针可以是。

  • 对于非VLA情况下,阵列尺寸必须为编译时间常数但对于malloc()在运行时被指定的大小。换句话说,对于数组,您需要知道编译时的大小,而对于malloc() -ing,完全可以在运行时确定所需的大小。

  • 数组无法重新调整大小。一旦定义,他们使用所需的所有内存大小。根据需要,OTOH是一个malloc() -ed指针,指向一定数量的内存,很可能是realloc() -ed其他数量的内存。

+2

另外,可以通过检查'malloc()'等的返回值来检测分配失败,但是分配静态数组或VLA的失败不可检测AFAIK。 –

0

因为数组大小应该在编译时可用,而使用指针可以让你在运行时确定它的大小。

+1

也许你应该添加“非VLA”。 –

+0

是的,但是VLA只是一个选项。 –

0

this link

动态内存分配允许你的程序,以获得更多的存储空间运行时,或者如果它不要求将其释放。

简而言之,动态内存分配允许您手动处理程序的内存空间。

Here您还可以读取静态分配中所需的内存由编译器分配,并且在编译时必须知道存储的确切大小和类型。另一方面,在动态内存分配中,在运行期间“动态”分配的内存和动态分配的空间通常放置在称为堆或自由存储的程序段中。

0

随着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仅仅分配一些连续的内存,给你一个指向内存的开始 - 在技术上这是的一些事,作为一个阵列(它可以像它在相当多的情况下被使用,但不全部情况)

+0

,但我不能在运行时得到 - 例如 - 一个来自用户的int,并将其赋值给一个变量(比如x),然后声明一个数组arr [6]; ? –

+0

不,因为C语言不允许数组长度以这种方式变化。在这种情况下使用'malloc' *虽然可以通过 – Toby

+0

来实现,但实际上你可以这样做:'char bar [foo]' –

1

主要区别在于动态分配的内存可根据需要调整大小;数组(静态,自动或可变长度)在实例化后无法调整大小。

次要的区别与阵列的生存期有关。在文件范围或static关键字声明的数组的生命周期延长了整个程序的生命周期。在函数或块中声明的数组,但不包含关键字static的生命期限制在它们的封闭范围内(这就是为什么不能从函数返回指向本地数组的指针 - 数组不再存在当函数退出时为)。

动态存储器介于两者之间 - 其使用期限从最初的*alloc调用延伸到free调用,可能有不同的功能。 直接控制其寿命。

由于内存通常是如何管理auto(本地)变量的,因此自动和可变长度数组通常不能任意大 - 尝试创建超过兆字节左右大小的本地数组可能会导致流行平台上的运行时错误。您通常在动态分配的内存上没有这样的限制。

相关问题