15

假设我有两个代码示例用于创建一个包含 10 个元素的整数数组:

int *pi = (int*)0; 
realloc(pi,10);

另一个是正常写的,即:

int *pi;
pi= malloc(10*sizeof(int));

现在,我的问题是:第一种类型的赋值是合法的,但没有使用。为什么,虽然我可能会得到我选择的起始位置?
用常量初始化指针是合法的,但不被使用。为什么?

4

3 回答 3

30

NULL被传递时,realloc相当于mallocNULL如果您在某种循环中重新分配并且不想在第一次分配时出现特殊情况,则该调用可能很有用。


当我们这样做时,使用 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 中,您不必在作用域的顶部声明变量。事实上,通常建议定义尽可能接近其用途的变量。

于 2012-11-12T19:50:36.373 回答
10

C 要求传递给的指针realloc必须是从 获得的指针malloccallocrealloc函数调用(或空指针)。

于 2012-11-12T19:50:26.147 回答
4

第一个赋值是合法的,因为你传入的指针realloc()必须是之前通过某种分配给你的。(此外,你忽略了它的返回值,这是你绝对不能对分配做的事情!)

malloc()是为某些固定大小的东西创建一个缓冲区。realloc()是返回一个缓冲区并获得另一个(可能)不同大小的缓冲区 - 它可能会返回您正在使用的相同缓冲区。

于 2012-11-12T19:51:47.033 回答