c - 如何分配内存并将其返回(通过指针参数)给调用函数?

标签 c pointers malloc

我在几个不同的函数中有一些代码,看起来像这样:

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),这可能不会导致问题,但需要注意这一点。我已经在上面的代码中更正了这个问题。

这里有一些关于指针到指针的有用问题:

How do pointer to pointers work in C?

Uses for multiple levels of pointer dereferences?

关于c - 如何分配内存并将其返回(通过指针参数)给调用函数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1398307/

相关文章:

c - 如何从 libharu 创建的 pdf 中获取二进制数据?

c++ - __func__ 指针的两个 constexpr 实例的差异仍然是 constexpr 吗?

pointers - 通过反射改变接口(interface)下的指针类型和值

c - `*(*(p+1)+1)[7]` 如何等于 `p[1][8][0]` ?

c - malloc的返回值是虚拟地址还是物理地址?

c - qsort()无法理解C中的细节

c - 跳过 C 中的函数调用

c - 在 C 中处理两个文件

c - C 中的错误处理,void 返回函数

c - 从数组读取段错误(可能与 malloc/realloc 相关)