C 如何更改函数中参数的值
我试试看:C 如何更改函数中参数的值,c,malloc,C,Malloc,我试试看: #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; } #包括 #包括 void foo(int*x)
#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;
}
#包括
#包括
void foo(int*x)
{
x=(int*)malloc(sizeof(int));
*x=5;
}
int main()
{
INTA;
foo&a;
printf(“%d\n”,a);//a=-858993460
返回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
中,变量x
是一个局部变量,是指向int的指针-它是一个包含值的变量,该值是内存中int
的地址
您正在使用main的a
变量的地址调用函数。但是你正在改变x
x = (int *)malloc(sizeof(int));
这将x
更改为一个不同的值,即现在保留供我们使用的内存区域的地址。但是,x
是foo
的局部变量。当foo
结束时,x
消失,我们返回main
。发生了两件事:
main
sa
的内容<代码>a仍然在我们调用foo之前的位置
也许前面对相关问题的回答会对您有所帮助:foo&a代码>将变量的地址传递给函数
传递的地址现在被复制并存储在void foo(int*x)
中x
是函数的局部指针变量x
x=(int*)malloc(sizeof(int))代码>。在这里,您将使用完全不同的地址覆盖
的内容,以动态分配内存x
*x=5代码>在这里,您将值5分配给驻留在堆上的内存
在这里,您忘记了在函数中所做的一切。由于没有}
内存,因此创建了内存泄漏。除此之外,函数没有做任何影响程序其余部分的事情。它只处理局部变量释放()
x
此处打印未初始化变量printf(“%d\n”,a)
的内容,该变量未被函数更改a
此外,在C中强制转换malloc的结果是没有意义的。此外,malloc可以在
stdlib.h
中找到。不要使用malloc.h
,这是一个多余的非标准标题。因为您已经更改了此行中x
的原始值:x=(int*)malloc(sizeof(int))代码> >不要<代码> Malc ,不要在C中抛出指针,铸造<代码> Value*/Cuff>是C++的东西。