如何从函数修改堆指针
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 所示)。
如何从函数中更改分配给堆的全局指针?这是我正在使用的,(调用 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 所示)。