我试试:
#include <stdio.h>
#include <malloc.h>
void foo(int* x)
{
x = (int *)malloc(sizeof(int));
*x = 5;
}
int main()
{
int a;
foo(&a);
printf("%dn",a); //a = -858993460
return 0;
}
为什么 a 的值 != 5 . 我在VS2010,Windows 7中运行此代码。
您正在通过 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
中没有通过引用传递,而只能按值传递 - 因为变量值被复制到函数中。
x
已经在形式参数中初始化,malloc
将创建指向另一个内存位置的x
。
void foo(int* x)
{
/* x = (int *)malloc(sizeof(int)); */
*x = 5;
}
请查看 Acme 的答案,以获得非常好的图表表示。
-
foo(&a);
将变量的地址传递给函数。 -
void foo(int* x)
传递的地址现在被复制并存储在x
中。x
是函数的局部指针变量。 -
x = (int *)malloc(sizeof(int));
.在这里,您可以使用完全不同的地址覆盖x
的内容,以动态分配内存。 -
*x = 5;
在这里,您将值 5 分配给驻留在堆上的内存。 -
}
在这里,您忘记了在函数中所做的一切。您创建了内存泄漏,因为您没有free()
内存。除此之外,该函数没有执行任何影响程序其余部分的操作。它只是摆弄局部变量x
. -
printf("%dn",a);
在这里打印未初始化变量a
的内容,该变量尚未被函数更改。
此外,在 C 中转换 malloc 的结果是没有意义的。此外,在stdlib.h
中发现了malloc。不要使用malloc.h
,这是一个多余的、非标准的标题。
在foo
中,变量x
是一个局部变量,一个指向 int 的指针 - 它是一个包含值的变量,该值是内存中int
的地址。
您正在使用 main 的 a
变量的地址调用该函数。但是你正在改变x
x = (int *)malloc(sizeof(int));
这会x
更改为不同的值,即现在保留供我们使用的内存区域的地址。但是,x
是 foo
的局部变量。当foo
结束时,x
消失了,我们回到main
。发生了两件事:
- 我们已经分配了一些内存,
- 我们已经为它分配了一个值。
然后打印出main
a
的内容。 a
仍然在我们打电话给foo之前的位置。
也许前面对相关问题的回答会对您有所帮助: 传输方法中的指针错误(c++)