如何从函数修改堆指针

How to modify a heap pointer from a function

如何从函数中更改分配给堆的全局指针?这是我正在使用的,(调用 modify_p 段错误,我在调试器中看不到太多信息):

#include <stdio.h>
#include <stdlib.h>

int *p;

void set_p(int *p, int sz) {
        p = malloc(sz * sizeof(int));
}

void modify_p(int *p) {
    p[0] = 2;
}

int main(int argc, char *argv[])
{
    set_p(p, 3);
    modify_p(p);
    //printf("%d\n", p[0]);
    // should print 2   
    return 0;
}

谢谢

问题是您将 p 的副本传递给 set_p。所以原来的p永远不会被修改,永远不会指向有效内存,而副本在set_p结束时丢失,泄漏内存。相反,传递一个指向 p 的指针(因此是一个指向指针的指针),如下所示:

void set_p(int **p, int sz) {
    *p = malloc(sz * sizeof(int));
}

并像这样调用函数:

set_p(&p, 3);

然后你得到了预期的结果。

一种方法是这样做:

#include <stdio.h>
#include <stdlib.h>

int *p;

void set_p(int sz) {
        p = malloc(sz * sizeof(int));
}

void modify_p() {
    p[0] = 2;
}

int main(int argc, char *argv[])
{
    set_p(3);
    modify_p();
    printf("%d\n", p[0]);
    // should print 2   
    return 0;
}

由于p是在任何函数之外声明的,您可以直接写入它。当您执行 set_p(p, 3); 时,set_p 函数将拥有变量的本地副本。

如果你想改变一个指针指向什么,你必须传递指针的地址(如 Blaze 所示)。