正确计算malloc()和realloc()大小的方法是什么?

3
我看过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)”有什么区别?这是因为两者都可以使用,所以我不知道为什么要使用“sizeof *some_name”。是否有一种比另一种更好的理由呢?

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

4

它们是相同的。使用您之前的示例的原因是,如果您决定更改类型,可以后期轻松维护。

尽管如此,请不要像那样使用realloc - 如果失败,您将泄漏原始的randomNum分配。


那么第二个更好,尽管需要更多的维护? - jc72
1
什么?不,我认为第一个更好,个人观点而已。其他人可能有不同的想法,但它们都一样,所以并不重要。 - Carl Norum

1

接受答案后

@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);
}

@jc72 更多关于realloc()的细节,请参见http://codereview.stackexchange.com/questions/36662/critique-of-realloc-wrapper - chux - Reinstate Monica

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接