-1

我试试看:

#include <stdio.h>
#include <malloc.h>

void foo(int* x)
{
   x = (int *)malloc(sizeof(int));
   *x = 5;
}

int main()
{

   int a;
   foo(&a);
   printf("%d\n",a);  //a = -858993460
   return 0;    

}

为什么 a != 5 的值。我在 vs2010,windows 7 中运行此代码。

4

4 回答 4

6

您正在通过 malloc 调用更改 foo 中的指针值 - 只需执行以下操作:

void foo(int* x)
{
   *x = 5;
}

在您的代码中 - 此功能:

void foo(int* x)
{
   x = (int *)malloc(sizeof(int));
   *x = 5;
}

工作如下:

+----+
| a  |
+----+
/
x points here

然后你在x其他地方指出:

+----+                            +----+
| 5  | /* created by malloc*/     | a  |
+----+                            +----+
/ On Heap                         / On Stack
x now points here                a is now in memory somewhere not getting modified.

你成功了5。另请注意 -x&a地址的本地副本a-C因为没有按引用传递,而只有按值传递 - 因为变量值被复制到函数中。

于 2013-11-13T06:49:32.307 回答
1

指针x已经在形式参数中初始化,malloc将创建x指向另一个内存位置。

void foo(int* x)
{
 /* x = (int *)malloc(sizeof(int)); */
  *x = 5;
}

请查看 Acme 的答案以获得非常好的图表表示。

于 2013-11-13T06:51:22.743 回答
1
  • foo(&a);将变量的地址传递给函数。

  • void foo(int* x)传递的地址现在被复制并存储在x. x是函数局部的指针变量。

  • x = (int *)malloc(sizeof(int));. 在这里,您使用完全不同的地址覆盖 的内容x,以动态分配内存。

  • *x = 5;在这里,您将值 5 分配给驻留在堆上的该内存。

  • }在这里,您忘记了您在函数中所做的一切。由于您没有内存,因此您创建了内存泄漏free()。除此之外,该函数没有做任何影响程序其余部分的事情。它只是摆弄局部变量x

  • printf("%d\n",a);在这里打印未初始化变量的内容,该变量a未被函数更改。

此外,在 C 中强制转换 malloc 的结果是毫无意义的。此外,malloc 在stdlib.h. 不要使用malloc.h,这是一个多余的、非标准的标题。

于 2013-11-13T07:51:12.277 回答
-1

foo, variablex是一个局部变量,一个指向 int 的指针 - 它是一个包含值的变量,该值是 anint在内存中的地址。

您正在使用 maina变量的地址调用该函数。但是你正在改变 x

x = (int *)malloc(sizeof(int));

这变成x了一个不同的值,即现在保留给我们使用的内存区域的地址。但是,x是一个局部变量foofoo结束时,离开x,然后我们返回main。发生了两件事:

  1. 我们分配了一些内存,
  2. 我们已经给它赋值了。

然后打印出mains的内容aa仍然在我们调用 foo 之前的相同位置。

也许之前对相关问题的回答会对您有所帮助:传输方法中的指针错误(c ++)

于 2013-11-13T07:00:25.717 回答