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