假设我有两个代码示例用于创建10个元素的整数数组:
int *pi = (int*) 0x000; //base ADDRESS of OS
realloc(pi,10);
另一个是正常写的,即:
int *pi;
pi=(int*) malloc(10*sizeof(int));
现在,我的问题是:第一种类型的转让是合法的,但没有使用。为什么? 它们之间有什么区别?
答案 0 :(得分:5)
注意:等效呼叫为realloc(pi, 10 * sizeof(int))
realloc doc解释说,在特定情况下,调用与malloc相同:
如果ptr为NULL,则realloc()与对malloc()的大小字节的调用相同。
答案 1 :(得分:3)
realloc
可以扩展,缩小或不更改已分配的内存段。根据实现情况,它可能比分配新块和复制旧内容(可能是部分内容)和删除旧内容更有效。
除此之外,realloc
超过空指针应具有与malloc
完全相同的结果和性能。
答案 2 :(得分:2)
0x000
不是OS的基地址,它是整数0
,编译器会将其转换为空指针。所以第一段代码与:
int *pi = realloc(NULL,10);
它具有相同的效果
int *pi = malloc(10);
请注意,由于缺少sizeof(int)
,它与您的第二个示例不同。
在这种情况下,人们通常不使用realloc
的原因只是malloc
可以完美地完成工作。
答案 3 :(得分:1)
realloc()
函数希望它的第一个参数是一个指针,它是通过以前发出的malloc()
调用获得的。它分配一个新的内存块并释放以前分配的内存块。
如果您将NULL
传递给realloc()
,其行为与malloc()
相同。