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