gpt4 book ai didi

C - realloc 不反射(reflect)回 main

转载 作者:太空宇宙 更新时间:2023-11-04 03:29:13 27 4
gpt4 key购买 nike

我目前正在学习动态内存管理是如何工作的,更具体地说是 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 失败时)。它什么都不做。

关于C - realloc 不反射(reflect)回 main,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38423468/

27 4 0