作为练习,我正在尝试重写 realloc 函数
void updateSize(void* p,int length)
{
free(p);
malloc(sizeof(p) * length);
}
int main(int argc,char* argv[])
{
int *y =malloc(sizeof(int)*3);
y = updateSize(y, 5);
}
但是当我尝试编译它时,出现以下错误:
void value not ignored as it ought to be.
此错误的原因是什么?如何修复?
最佳答案
OP 不会从函数返回值,也不会根据需要复制数据。
// Function return value of `void` needs to be `void *`.
// `length` should be of type size_t
// The former length of `p` needs to be passed.
// Potential NULL pointers need testing.
void updateSize(void* p,int length) {
// Missing data copy.
// Allocate new memory and copy before freeing old
free(p);
// Returned value from malloc needs saving.
// No reason for 'sizeof()'
malloc(sizeof(p) * length);
}
// Recommend
void *updateSize2(void* p, size_t OldLength, size_t NewLength) {
void *p2 = malloc(NewLength);
if (p && p2) {
memcpy(p2, p, OldLength < NewLength ? OldLength : NewLength);
}
if (p2 || (NewLength == 0)) {
free(p); // Note A
}
return p2;
}
<小时/>
注意 A:当 NewLength == 0
时,有一个有趣的问题。一些malloc(0)
实现返回 NULL,其他实现返回指向“无数据”的指针。在前者中,NULL 指针并不总是意味着失败 malloc()
。现在,@sharth 正确地指出 free(p)
仅应在内存分配失败时调用 if()
这里使用的条件是 NewLength
.
关于c - 尝试用c重写realloc函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18943181/