我目前正在学习动态内存管理是如何工作的,更具体地说是realloc以及如何在函数中完成。
在下面的程序中,我只想尝试使用malloc在函数a()中分配一些数字,然后将它们传递给另一个函数b()。在b()中,我将指针的地址传递给c(),以便将内存重新分配两倍大小并用数字初始化。
现在提出我的问题:为什么函数b()中的输出显示正确的数字,但在主函数中却没有?不应该指针"数字"在主要还指向重新分配的内存?
提前致谢。
代码:
#include <stdlib.h>
#include <stdio.h>
#define SIZE 3
int a(int **numbers);
int b(int *numbers);
int c(int **numbers);
int main()
{
int *numbers = NULL;
a(&numbers);
for(size_t i = 0; i < 2 * SIZE; i++)
printf("In main after a: %i\n", numbers[i]);
b(numbers);
for(size_t i = 0; i < 2 * SIZE; i++)
printf("In main after b: %i\n", numbers[i]);
return 0;
}
int a(int **numbers)
{
*numbers = malloc(SIZE * sizeof(numbers));
if(!numbers)
{
free(numbers);
return -1;
}
for(size_t i = 0; i < SIZE; i++)
(*numbers)[i] = i;
return 0;
}
int b(int *numbers)
{
c(&numbers);
for(size_t i = 0; i < 2 * SIZE; i++)
printf("In b after c: %i\n", numbers[i]);
return 0;
}
int c(int **numbers)
{
int *n_new = realloc(*numbers, 2 * SIZE * sizeof(numbers));
if(!n_new)
{
free(n_new);
return -1;
}
for(size_t i = 0; i < 2 * SIZE; i++)
n_new[i] = i * 2;
*numbers = n_new;
return 0;
}
输出:
In main after a: 0
In main after a: 1
In main after a: 2
In main after a: 0
In main after a: 0
In main after a: 0
In b after c: 0
In b after c: 2
In b after c: 4
In b after c: 6
In b after c: 8
In b after c: 10
In main after b: 0
In main after b: 0
In main after b: 2
In main after b: 0
In main after b: 0
In main after b: 0
答案 0 :(得分:1)
您还需要通过指针将指针传递给b()
。就目前而言,调用b(pointer)
无法修改main()
中的指针。与您拨打a(&pointer)
的方式相同。
另外,不要在你知道为null的指针上调用free()
(当malloc失败时)。它没有做任何事情。