2

我有以下代码:

#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返回一个指向新内存地址的指针。

所以问题是,除了释放 original 创建的位置之外,我是否应该明确释放这个位置malloc

或者它正在做上面代码所期望的事情Just expand the memory location reserved previously

谢谢。

EDIT: 实际上,下面的每个答案都为我提供了宝贵的信息。而且因为我必须选择一个答案来接受。我选择了更正我上述代码的那个!

4

4 回答 4

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);
于 2011-09-19T21:54:46.660 回答
4

这里有两种情况。

  • Realloc 失败:你只负责释放原始指针
  • realloc 成功:你只负责释放返回的指针

注意:该realloc函数不保证扩展内存位置。实际上,它可以通过选择大小 0 来缩小内存。

于 2011-09-19T21:50:03.247 回答
2

除了释放原始malloc创建的位置之外,我应该明确释放这个位置吗?

不,realloc 应该解决这个问题。即使在新的地址空间中重新分配内存,如果 realloc 成功,先前使用 malloc 分配的内存也会自动释放。

于 2011-09-19T21:51:04.040 回答
1

Realloc 可以做以下三件事之一:

1)它发现你以前的记忆可以扩展而无需重新整理。

2)可以满足您的要求,但内存对象必须放在另一个地方。

3)它可能会失败。

在你的情况下 1) 发生了,看起来是这样。编辑:它确实返回了一个不同的指针,所以它选择了 2)

顺便说一句,在情况 3)它返回 NULL。什么也没发生,您的指针仍然指向有效的旧对象。

于 2011-09-19T21:53:32.577 回答