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

a_m*_*m0d 32 c malloc pointers

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

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;
}
Run Code Online (Sandbox Code Playgroud)

someFunction ()useData ()在单独的模块(*.c文件)中定义.

问题是,虽然malloc工作正常,并且分配的内存可用someFunction,但一旦函数返回,相同的内存就不可用.

这里可以看到程序的示例运行,输出显示各种存储器地址.

有人可以向我解释我在这里做错了什么,以及如何让这段代码工作?


编辑:所以似乎我需要使用双指针来做这个 - 当我真的需要使用双指针时,我将如何做同样的事情?所以例如数据就是

int **data = NULL; //used for 2D array
Run Code Online (Sandbox Code Playgroud)

那么我是否需要在函数调用中使用三指针?

Mar*_*n B 61

你想使用指针指针:

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;
}
Run Code Online (Sandbox Code Playgroud)

为什么?好吧,你想data在主函数中改变你的指针.在C中,如果您想要更改作为参数传入的内容(并且在调用者的版本中显示该更改),则必须传入指向您想要更改的内容的指针.在这种情况下,"你想要改变的东西"是一个指针 - 所以为了能够改变那个指针,你必须使用一个指针到指针......

请注意,除了主要问题之外,代码中还有另一个错误:sizeof(data)为您提供存储指针所需的字节数(32位操作系统上4个字节或64位操作系统上8个字节),而您确实需要存储指针所指向的字节数(一个int,即大多数操作系统上的4个字节).因为通常情况下sizeof(int *)>=sizeof(int),这可能不会引起问题,但需要注意的是.我在上面的代码中已经纠正了这一点.

以下是关于指针指针的一些有用的问题:

指向指针的指针如何在C中工作?

用于多级指针解引用?

  • 我建议不要把它称为"双指针" - 太容易与"双指针"混淆. (4认同)

Sid*_*ati 8

一个常见的陷阱,特别是如果您将Java从C/C++转移到C/C++

记住,当你传递一个指针时,它会传递值,即复制指针的值.对指针指向的数据进行更改是有好处的,但指针本身的任何更改都只是本地的,因为它是一个副本!!

诀窍是使用通过引用传递指针,因为你想要改变它,即malloc它等.

**指针 - >会吓到一个noobie C程序员;)

  • 指针是一种类型,其值是内存地址.我们使用此指针类型指向内存中的其他对象.假设您将指针p {val:0x1234}传递给函数.(记住指针也是对象,所以它们也有一个地址,比如说0x8888) - 该函数将获得指针,并且能够访问0x1234处的对象,但指向此地址的指针与指针处的指针不同于0x8888 ,它是一个副本,只是具有相同的价值! - 这类似于通过值传递int.它被复制了. (4认同)

Ben*_*Ben 6

如果要修改指针,则必须将指针传递给指针。

IE。:

void someFunction (int **data) {
  *data = malloc (sizeof (int)*ARRAY_SIZE);
}
Run Code Online (Sandbox Code Playgroud)

编辑:添加了 ARRAY_SIZE,在某些时候您必须知道要分配多少个整数。

  • `sizeof` 应该是 `sizeof(**data)` (或者简单的 `sizeof(int)`);这个错误已经存在于原始代码中。 (2认同)