我在几个不同的函数中有一些代码,看起来像这样:
void someFunction (int *data) {
data = (int *) malloc (sizeof (data));
}
void useData (int *data) {
printf ("%p", data);
}
int main () {
int *data = NULL;
someFunction (data);
useData (data);
return 0;
}
someFunction ()
和 useData ()
定义在单独的模块(*.c 文件)中。
问题是,虽然 malloc 工作正常,并且分配的内存在 someFunction
中可用,但一旦函数返回,相同的内存就不可用了。
程序运行示例可见here ,输出显示各种内存地址。
有人可以向我解释我在这里做错了什么,以及如何让这段代码工作吗?
编辑:所以看起来我需要使用双指针来执行此操作 - 当我实际上需要使用双指针时,我将如何做同样的事情?所以例如数据是
int **data = NULL; //used for 2D array
然后我需要在函数调用中使用三重指针吗?
最佳答案
你想使用一个指向指针的指针:
void someFunction (int **data) {
*data = malloc (sizeof (int));
}
void useData (int *data) {
printf ("%p", data);
}
int main () {
int *data = NULL;
someFunction (&data);
useData (data);
return 0;
}
为什么?好吧,您想在 main 函数中更改指针 data
。在 C 语言中,如果您想要更改作为参数传入的某些内容(并让该更改显示在调用者的版本中),您必须传入一个指向您想要更改的任何内容的指针。在这种情况下,“你想改变的东西”是一个指针——所以为了能够改变那个指针,你必须使用一个指向指针的指针……
请注意,除了您的主要问题之外,代码中还有另一个错误:sizeof(data)
为您提供了存储指针所需的字节数(32 位上为 4 个字节) OS 或 64 位操作系统上的 8 个字节),而您真正想要的是存储指针指向的内容所需的字节数(int
,即 4 个字节大多数操作系统)。因为通常 sizeof(int *)>=sizeof(int)
,这可能不会导致问题,但需要注意这一点。我已经在上面的代码中更正了这个问题。
这里有一些关于指针到指针的有用问题:
关于c - 如何分配内存并将其返回(通过指针参数)给调用函数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1398307/