我有以下代码:
#include <stdio.h>
#include <stdlib.h>
#define OUT
void getDataFromServer(OUT int** array, OUT int* size)
{
static int tmpArr[] = {0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0A, 0x0B, 0x0C, 0x0D, 0x0E, 0x0F,
0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17, 0x18, 0x19, 0x1A, 0x1B, 0x1C, 0x1D, 0x1E, 0x1F};
*size = sizeof tmpArr / sizeof(int);
printf("Before realloc: %p\n", *array);
*array = realloc(*array, sizeof(*array) * *size);
printf("After realloc : %p\n", *array);
int i=0;
for (; i < *size; i++)
{
(*array)[i] = tmpArr[i];
}
}
int main(void)
{
int size = 0;
int* dataFromServer = malloc(sizeof *dataFromServer);
printf("in main: %p\n", dataFromServer);
getDataFromServer(&dataFromServer, &size);
int x;
for (x=0; x < size; x++)
printf("%d ", dataFromServer[x]);
printf("\n\n");
free(dataFromServer);
return 0;
}
输出:
in main: 003F1708
Before realloc: 003F1708
After realloc : 003F3430
0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31
从输出中,realloc
返回指向新内存地址的指针..
所以问题是,除了释放原始malloc
创建的位置之外,我是否应该明确释放此位置?
或者它正在执行上面代码所需的内容Just expand the memory location reserved previously
?
感谢。
EDIT
:实际上,下面的每个答案都为我提供了宝贵的信息。因为我只能选择一个答案来接受。我选择了纠正上述代码的那个!
答案 0 :(得分:5)
在你调用realloc
之后它返回了一些指针你应该忘记前一个指针而只是保留“新”指针。
如果realloc
调整了大小,那么realloc
将返回它,如果它在内存中分配了一个新空间并复制了它的先前内容,它将释放旧指针并返回一个新指针。
但是,永远不会用调用realloc
的结果覆盖旧指针(正如你在代码中所做的那样):事实上,当realloc
失败时它返回NULL
而 没有释放旧指针 ,所以,如果你要覆盖存储它的唯一变量,那么你就失去了唯一的方法必须free
那个记忆,因此你有内存泄漏。因此,调用realloc
的“规范”方式是:
/* assuming myPtr contains the malloced memory */
void * tempPtr=realloc(myPtr, newSize);
if(tempPtr==NULL)
{
/* realloc failed, handle the error and, if aborting, free myPtr */
}
else
myPtr = tempPtr;
/* ... */
/* when you no longer need it free the memory */
free(myPtr);
答案 1 :(得分:4)
这里有两种情况。
注意:realloc
函数无法保证扩展内存位置。事实上它可以通过选择大小为0来缩小内存。
答案 2 :(得分:2)
我应该明确地释放这个位置 - 除了释放位置 由原始的malloc创建?
没有。 realloc应该照顾好。即使内存在新的地址空间中重新分配,如果realloc成功,之前分配的内存也会自动释放malloc。
答案 3 :(得分:1)
Realloc可以做以下三件事之一:
1)它发现你以前的记忆可以扩展,而不需要把它甩掉。
2)是否可以满足您的要求,但必须将记忆对象放在另一个地方。
3)它可能会失败。
在你的情况下1)发生了,所以看来。编辑:它确实返回一个不同的指针,所以它选择2)
案例3中的BTW)它返回NULL。什么都没发生,你的指针仍然指向有效的旧对象。