正确的方法来计算malloc()和realloc()的大小?

时间:2014-04-14 05:15:53

标签: c malloc realloc

我见过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)”?是否有理由使用其中一个?

2 个答案:

答案 0 :(得分:3)

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

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

答案 1 :(得分:0)

接受回答后

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