【问题标题】:Correct way to calculate the size for malloc() and realloc()?计算 malloc() 和 realloc() 大小的正确方法?
【发布时间】:2014-05-27 23:04:12
【问题描述】:

我见过 malloc() 和 realloc() 使用了很多不同的方法。在测试了各种方法之后,我很想知道我是否正确使用它们??

第一次尝试

int size = rowSize * colSize;
int newSize = size + rowSize;

int *randomNum;

randomNum = malloc(size * sizeof *randomNum);

randomNum = realloc(randomNum, newSize * sizeof *randomNum);

这行得通!

然后我尝试了,

int size = rowSize * colSize;
int newSize = size + rowSize;

int *randomNum;

randomNum = malloc(size * sizeof(int));

randomNum = realloc(randomNum, newSize * sizeof(int));

这也有效。所以我想我不知道为什么我会使用“sizeof *some_name”而不是“sizeof(int)”?有理由使用其中一个吗?

【问题讨论】:

  • 为了正确,您应该在覆盖旧的之前检查realloc()的返回值。
  • 谢谢glglgl,你能给我举个例子吗?
  • @glglgl,好吧,我想我找到了一个例子,谢谢你的提示!

标签: c malloc realloc


【解决方案1】:

它们是一样的。使用前一个示例的原因是,如果您决定更改类型,以后可以简化维护。

也就是说,不要像那样使用realloc - 如果它失败了,你会泄露原来的randomNum 分配。

【讨论】:

  • 那么第二个更好,虽然它更需要维护?
  • 什么?不,第一个更好,恕我直言。其他人可能会有不同的想法;它们是一样的,所以没关系。
【解决方案2】:

接受回答后

@Carl Norum 的回答很好,但主要是这样完成的,它增加了几点。

使用sizeof(*pointer)sizeof(type) 是风格问题。
我发现第一个更易于维护且不易出错。适用于malloc()realloc()

size_t count = rowSize * colSize;
int *randomNum = malloc(count * sizeof *randomNum);
int *randomNum = malloc(count * sizeof(int));

例如realloc()

int *randomNum = NULL;
...
size_t N = foo();

// If N is zero, (a strange case) one might want to increase it.
// Successfully allocating 0 bytes may return NULL or a non-NULL pointer.

int *randomNum2 = realloc(randomNum, N * sizeof(*randomNum));
if (randomNum2 == NULL && N > 0) {
  // randomNum still contains what it use to.
  Handle_allocation_failure();
  ...
  free(randomNum);
}
else {
  // The happy path
  randomNum = randomNum2;
  ...
  free(randomNum);
}

【讨论】:

猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2017-06-15
  • 1970-01-01
  • 2022-11-20
  • 2013-12-23
  • 1970-01-01
  • 2012-05-07
  • 1970-01-01
相关资源
最近更新 更多