malloc和realloc之间的区别?

dee*_*iip 14 c pointers

假设我有两个代码示例用于创建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中,您不必在范围顶部声明变量.实际上,通常建议将变量定义为尽可能接近其使用.

  • @ me.deeiip不,这是一个错误的假设.您不能只使用任意内存地址,您使用的地址必须由其他函数授予您,以确保系统知道如何允许您使用它们. (3认同)
  • 或者`NULL`.只要编译器不抛出编译错误,这是合法的. (2认同)

oua*_*uah 9

C要求传递的指针realloc必须从所获得的指针malloc,callocrealloc函数调用(或空指针).

  • *::四处乱哄哄地抓着心脏::*哦,祸患就是我!摆出来的!再次!*::倒在地上,唱咏叹调,死得很长::*@PascalCuoq你赢了. (3认同)
  • 来自`alloc`系列函数的@mah可能是表达它的最佳方式. (2认同)

mah*_*mah 5

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

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