37

以我在这里学到的知识为基础:通过 C 中的函数操作动态数组

void test(int data[])
{
    data[0] = 1;    
}    

int main(void)
{    
    int *data = malloc(4 * sizeof *data);

    test(data);

    return 0;
}

这工作正常。但是,我也在尝试realloc在函数中使用。

void increase(int data[])
{
    data = realloc(data, 5 * sizeof *data);    
}

这符合但程序在运行时崩溃。

问题

我应该如何在函数中使用 realloc?

我知道我应该将结果分配realloc给一个变量并检查它是否是NULL第一个。这只是一个简化的例子。

4

3 回答 3

37

您想修改int*(您的数组)的值,因此需要将指向它的指针传递给您的increase函数:

void increase(int** data)
{
    *data = realloc(*data, 5 * sizeof int);
}

调用代码将如下所示:

int *data = malloc(4 * sizeof *data);
/* do stuff with data */
increase(&data);
/* more stuff */
free(data);
于 2012-12-06T16:43:29.013 回答
7

请记住指针和数组之间的区别。
数组是堆栈中的一块内存,仅此而已。如果您有一个数组:

int arr[100];

那么 arr 是一个内存地址,&arr 也是一个内存地址,而且那个内存地址是不变的,不存储在任何位置。所以你不能说 arr=NULL,因为 arr 不是指向某个东西的变量。它只是一个符号地址:数组开始的地址。相反,指针有它自己的内存并且可以指向内存地址。

将 int[] 更改为 int* 就足够了。
此外,变量是通过副本传递的,因此您需要将 int** 传递给函数。

关于如何使用 realloc,所有的教学示例都包括:

  1. 使用重新分配;
  2. 检查它是否为NULL。在这种情况下使用perror并退出程序;
  3. 如果它不为 NULL,则使用分配的内存;
  4. 不再需要时释放内存。

所以这将是一个很好的例子:

int* chuck= (int*) realloc (NULL, 10*sizeof(int)); // Acts like malloc,
              // casting is optional but I'd suggest it for readability
assert(chuck);
for(unsigned int i=0; i<10; i++)
{
    chunk[i]=i*10;
    printf("%d",chunk[i]);
}
free(chunk);
于 2012-12-06T16:54:50.703 回答
6

这两个代码都非常有问题,如果您使用相同的指针从 realloc 发送和接收,如果失败,您将失去稍后释放它的指针。

你应该做这样的事情:

{ ... ...

more = realloc(area , size);
if( more == NULL )
    free(area);
else
    area=more;

……

}

于 2017-05-19T13:23:54.157 回答