c - 尝试用c重写realloc函数

标签 c

作为练习,我正在尝试重写 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/

相关文章:

c - 有没有什么简单的方法可以用C语言创建队列

c - 如何从随机字节开始生成一个区间内的整数随机值

c - 如何使用 GCC 在 Mac 终端上调试 C 程序?

在 c 中创建 Pascal 三角形

c++ - 为什么 printf() 将 float 提升为 double ?

c - 从零件构建宏

c - 如何在我的 Eclipse 应用程序中添加鼠标悬停功能?

c - Windows套接字程序未收到udp数据

c - OpenGL - 将数据分配给 C 中的列表并在 glBufferData 中使用它无法正常工作

c - 为什么 Malloc 分配的内存比我请求的多?