假设我有两个代码示例用于创建10个元素的整数数组:
int *pi = (int*)0;
realloc(pi,10);
Run Code Online (Sandbox Code Playgroud)
另一个是正常写的,即:
int *pi;
pi= malloc(10*sizeof(int));
Run Code Online (Sandbox Code Playgroud)
现在,我的问题是:第一种类型的转让是合法的,但没有使用.为什么,虽然我可能会得到我选择的起始位置?使用常量的指针的初始化是合法的但不使用.为什么?
Cor*_*bin 28
啊,不!第一次通话不合法.你不能传递NULL
一些随机指针,希望最好.以realloc的第一个参数,必须为内存的指针,你的程序以前分配的(通过类似realloc
,malloc
或朋友),或一个空指针.
什么时候NULL
通过,它相当于NULL
.如果您在某种循环中重新分配并且不希望在第一次分配时出现特殊情况,则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
Run Code Online (Sandbox Code Playgroud)
作为切向的一面:历史是您在不同行上看到声明和作业的主要原因.在旧版本的C中,声明必须首先出现在函数中.这意味着即使你的函数在20行之前没有使用变量,你也必须在顶部声明.
由于您通常不知道另外20行中未使用的变量的值应该是什么,因此您无法始终将其初始化为任何有意义的值,因此您将留下声明并且在您的顶部没有任何作业功能.
在C99/C11中,您不必在范围顶部声明变量.实际上,通常建议将变量定义为尽可能接近其使用.
C要求传递的指针realloc
必须从所获得的指针malloc
,calloc
或realloc
函数调用(或空指针).
第一个赋值是不合法的,因为您传入的指针realloc()
必须事先通过某种分配方式提供给您。(此外,您忽略了它的返回值,这是您在分配时绝对不能做的事情!)
malloc()
是为某些固定大小的东西创建一个缓冲区。realloc()
是返回一个缓冲区并获取另一个(大概)不同大小的缓冲区 - 它可能会返回您正在使用的相同缓冲区。