如何通过函数修改堆指针

时间:2019-06-04 06:56:37

标签: c pointers scope heap-memory

如何从函数内部更改分配给堆的全局指针?这是我正在使用的(调用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;
}

谢谢

2 个答案:

答案 0 :(得分:3)

问题是您将p的副本传递给set_p。因此,原始p不会被修改,也永远不会指向有效的内存,并且副本在set_p的末尾会丢失,从而导致内存泄漏。而是将指针传递给p(因此是指向指针的指针),如下所示:

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

并调用如下函数:

set_p(&p, 3);

然后您会得到预期的结果。

答案 1 :(得分:1)

一种方法是这样做:

#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所示)。