C - realloc 不反映回 main
C - realloc not reflecting back to main
我目前正在学习动态内存管理是如何工作的,更具体地说是 realloc 以及它是如何在函数中完成的。
在下面的程序中,我只是想尝试使用 malloc 在函数 a() 中分配一些数字,然后将它们传递给另一个函数 b()。在 b() 中,我将指针的地址传递给 c() 以便重新分配两倍大小的内存并用数字对其进行初始化。
现在回到我的问题:为什么函数 b() 中的输出显示正确的数字,但在 main 函数中却没有? main 中的指针 "numbers" 不应该也指向重新分配的内存吗?
提前致谢。
代码:
#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
您还需要通过指针将指针传递给 b()
。就目前而言,调用 b(pointer)
不能修改 main()
中的指针。以与调用 a(&pointer)
相同的方式执行。
此外,不要在您知道为空的指针上调用 free()
(当 malloc 失败时)。它什么都不做。
我目前正在学习动态内存管理是如何工作的,更具体地说是 realloc 以及它是如何在函数中完成的。
在下面的程序中,我只是想尝试使用 malloc 在函数 a() 中分配一些数字,然后将它们传递给另一个函数 b()。在 b() 中,我将指针的地址传递给 c() 以便重新分配两倍大小的内存并用数字对其进行初始化。
现在回到我的问题:为什么函数 b() 中的输出显示正确的数字,但在 main 函数中却没有? main 中的指针 "numbers" 不应该也指向重新分配的内存吗?
提前致谢。
代码:
#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
您还需要通过指针将指针传递给 b()
。就目前而言,调用 b(pointer)
不能修改 main()
中的指针。以与调用 a(&pointer)
相同的方式执行。
此外,不要在您知道为空的指针上调用 free()
(当 malloc 失败时)。它什么都不做。