是什么malloc()
-ed阵列和规则排列的区别时,在这两个我必须指定内存大小,例如当我必须指定内存大小时,malloc数组和常规数组之间有什么区别?
char* arr = malloc(50 * sizeof(char))
VS
int arr [50]
是什么malloc()
-ed阵列和规则排列的区别时,在这两个我必须指定内存大小,例如当我必须指定内存大小时,malloc数组和常规数组之间有什么区别?
char* arr = malloc(50 * sizeof(char))
VS
int arr [50]
嗯,有太多的差异。首先,阅读有关arrays are not pointers and vice versa。从可用性来看
这就是说,三大差别(我觉得你有兴趣了解)
数组限制了它的封闭块一个范围,但动态除非手动解除分配,否则分配的记忆将会生效因此,函数的本地数组不能是retrun
ed,但是通过malloc()
-ing返回的指针可以是。
对于非VLA情况下,阵列尺寸必须为编译时间常数但对于malloc()
在运行时被指定的大小。换句话说,对于数组,您需要知道编译时的大小,而对于malloc()
-ing,完全可以在运行时确定所需的大小。
数组无法重新调整大小。一旦定义,他们使用所需的所有内存大小。根据需要,OTOH是一个malloc()
-ed指针,指向一定数量的内存,很可能是realloc()
-ed其他数量的内存。
另外,可以通过检查'malloc()'等的返回值来检测分配失败,但是分配静态数组或VLA的失败不可检测AFAIK。 –
因为数组大小应该在编译时可用,而使用指针可以让你在运行时确定它的大小。
也许你应该添加“非VLA”。 –
是的,但是VLA只是一个选项。 –
随着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
仅仅分配一些连续的内存,给你一个指向内存的开始 - 在技术上这是不的一些事,作为一个阵列(它可以像它在相当多的情况下被使用,但不全部情况)
,但我不能在运行时得到 - 例如 - 一个来自用户的int,并将其赋值给一个变量(比如x),然后声明一个数组arr [6]; ? –
不,因为C语言不允许数组长度以这种方式变化。在这种情况下使用'malloc' *虽然可以通过 – Toby
来实现,但实际上你可以这样做:'char bar [foo]' –
主要区别在于动态分配的内存可根据需要调整大小;数组(静态,自动或可变长度)在实例化后无法调整大小。
次要的区别与阵列的生存期有关。在文件范围或static
关键字声明的数组的生命周期延长了整个程序的生命周期。在函数或块中声明的数组,但不包含关键字static
的生命期限制在它们的封闭范围内(这就是为什么不能从函数返回指向本地数组的指针 - 数组不再存在当函数退出时为)。
动态存储器介于两者之间 - 其使用期限从最初的*alloc
调用延伸到free
调用,可能有不同的功能。 您直接控制其寿命。
由于内存通常是如何管理auto
(本地)变量的,因此自动和可变长度数组通常不能任意大 - 尝试创建超过兆字节左右大小的本地数组可能会导致流行平台上的运行时错误。您通常在动态分配的内存上没有这样的限制。
'char'和'int'是完全不同的类型......并且您不会将苹果与桔子进行比较,无论如何。 –
你是什么意思 - 有什么区别?问题还不清楚 – KevinDTimm