假设我有两个代码示例用于创建10个元素的整数数组:
int *pi = (int*) 0xDEADBEEF;
realloc(pi,10);
另一个是正常写的,即:
int *pi;
pi= malloc(10*sizeof(int));
现在,我的问题是:第一种类型的转让是合法的,但没有使用。为什么,虽然我可能会得到我选择的起始位置? 使用常量的指针的初始化是合法的但不使用。为什么呢?
答案 0 :(得分:27)
realloc
一些随机指针并希望最好。 realloc的第一个参数必须是指向程序之前分配的内存的指针(通过诸如malloc
,calloc
或朋友之类的东西)或空指针。
传递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行的变量,因此您不能总是将其初始化为任何有意义的变量,因此您将留下声明并且不会在功能的顶部。
在C99 / C11中,您不必在范围顶部声明变量。实际上,通常建议将变量定义为尽可能接近其使用。
答案 1 :(得分:9)
C要求传递给realloc
的指针必须是从malloc
,calloc
或realloc
函数调用(或空指针)获得的指针。
答案 2 :(得分:4)
第一个作业是不合法,因为您传递到realloc()
的指针必须先前通过某种分配给您。 (此外,你忽略了它的返回值,你必须永远不要做分配!)
malloc()
是为某些固定大小的东西创建一个缓冲区。 realloc()
是给予一个缓冲区并获得另一个(大概)不同大小的缓冲区 - 它可能会返回你正在使用的缓冲区。