我不明白为什么我的代码的第一个版本可以工作而第二个版本不行。
第一个版本:
#include <stdio.h>
#include <stdlib.h>
void procedure(int *t){
t = (int*)realloc(t, 4*sizeof(int));
t[3] = 4;
}
int main()
{
int *var;
var = (int*)malloc(sizeof(int));
procedure(var);
printf("%d\n\n", var[3]);
}
第二个版本:
#include <stdio.h>
#include <stdlib.h>
void procedure(int *t){
t = (int*)malloc(4*sizeof(int));
t[3] = 4;
}
int main()
{
int *var = NULL;
procedure(var);
printf("%d\n\n", var[3]);
}
在第二个版本中,var 在过程执行后仍然是一个 NULL 指针。为什么?
最佳答案
在您的代码的第二个版本中,您只是将 var
指向的地址传递给它。在 procedure(...)
中,本质上,您声明了一个 int 指针,并在第一行(malloc 行)为该指针分配了一个值(value)。 var
不会用这个值更新,因为 var 完全是一个独立的实体。
本质上,您不妨执行以下操作:
int *var = NULL;
int *t = malloc(4*sizeof(int));
t[3]=4;
printf("%d\n\n", var[3]);
var
永远不会重新分配给任何东西,因此 var 将始终为 null。
不过,这可以更正,如下所示:
#include <stdio.h>
#include <stdlib.h>
void procedure(int **t){
*t = malloc(4*sizeof(int));
(*t)[3] = 4;
}
int main()
{
int *var = NULL;
procedure(&var);
printf("%d\n\n", var[3]);
}
您可以在以下位置查看此工作:https://ideone.com/aTY9Ok
编辑:此外,值得注意的是,您应该在第一个版本中做同样的事情,因为 realloc(...)
可能会返回一个不同的地址var
这可能会导致内存泄漏。
关于c - 动态分配和程序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41751454/