我试试看:
#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中运行此代码。
答案 0 :(得分: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
中没有通过引用传递但只传递值 - 因为变量值是复制到函数中。
答案 1 :(得分:1)
指针x
已在正式参数中初始化,malloc
将创建指向另一个内存位置的x
。
void foo(int* x)
{
/* x = (int *)malloc(sizeof(int)); */
*x = 5;
}
请查看Acme的答案,以获得非常好的图示表示。
答案 2 :(得分:0)
在foo
中,变量x
是一个局部变量,一个指向int的指针 - 它是一个包含值的变量,该值是内存中int
的地址。
您正在使用main a
变量的地址调用该函数。但是你正在改变x
x = (int *)malloc(sizeof(int));
这会将x
更改为不同的值,即现在为我们保留的内存区域的地址。但是,x
是foo
的本地变量。当foo
结束时,x
消失,我们返回main
。发生了两件事:
然后打印出main
s a
的内容。 a
仍与我们调用foo之前的位置相同。
或许以前对相关问题的回答可以帮助您:Pointer errors in the method of transmission(c++)
答案 3 :(得分:0)
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的结果也没有意义。另外,在stdlib.h
中可以找到malloc。不要使用malloc.h
,这是一个多余的非标准标题。