c - 动态分配和程序

标签 c

我不明白为什么我的代码的第一个版本可以工作而第二个版本不行。

第一个版本:

#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/

相关文章:

c - 如何在文件末尾自动追加换行符

c - 以有效的方式在字符串之间查找字符串

c - 在 Eclipse CDT 中设置优化标志

c - 警告 : linux kernel module functions undefined

c++ - 如何在静态库 (Visual Studio) 中嵌入图标 (.ico)

c++ - 绘画后winapi窗口不刷新

c - 在 C 中安全地打印结构的所有属性

c - arm-none-eabi-gcc : Printing float number using printf

c - struct中的char []和char *有什么区别?

c - 如何正确执行 strcmp?