malloc和realloc之间的区别?
假设我有两个代码示例用于创建10个元素的整数数组:
int *pi = (int*) 0xDEADBEEF; realloc(pi,10);
另一个是正常写的,即:
int *pi; pi= malloc(10*sizeof(int));
现在,我的问题是:第一种类型的转让是合法的,但没有使用。 为什么,虽然我可以得到我选择的起始位置? 使用常量的指针的初始化是合法的但不使用。 为什么?
啊,不! 第一次通话不合法。 你不能传递realloc
一些随机指针,并希望最好的。 realloc的第一个参数必须是指向程序之前分配的内存的指针(通过类似malloc
, calloc
或friends的东西)或空指针。
传递NULL
,它等同于malloc
。 如果您在某种循环中重新分配并且不希望在第一次分配时出现特殊情况,则NULL调用可能很有用。
虽然我们正在使用它,但使用malloc和realloc的相当标准的方法是:
int* p; p = malloc(10 * sizeof(int)); //Note that there's no cast //(also, it could just be int* p = malloc(...);) int* np = realloc(p, 15 * sizeof(int)); //Note that you keep the old pointer -- this is in case the realloc fails
切向一边:历史是您在不同行上看到声明和作业的主要原因。 在旧版本的C中,声明必须首先出现在函数中。 这意味着即使你的函数在20行之前没有使用变量,你也必须在顶部声明。
由于您通常不知道另外20行不使用的变量的值应该是什么,因此您不能总是将其初始化为任何有意义的值,因此您将留下声明并且在您的顶部没有任何作业function。
在C99 / C11中,您不必在范围顶部声明变量。 实际上,通常建议将变量定义为尽可能接近其使用。
C要求传递给realloc
的指针必须是从malloc
, calloc
或realloc
函数调用(或空指针)获得的指针。
第一个赋值不合法,因为传递给realloc()
的指针必须先通过某种赋值给你。 (此外,你忽略了它的返回值,你必须永远不要做分配!)
malloc()
是为某些固定大小的东西创建一个缓冲区。 realloc()
是返回一个缓冲区并获得另一个(大概)不同的大小 – 它可能会返回你正在使用的相同缓冲区。