C语言 如何更改函数中参数的值



我试试:

#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.另请注意 - xa &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更改为不同的值,即现在保留供我们使用的内存区域的地址。但是,xfoo 的局部变量。当foo结束时,x消失了,我们回到main。发生了两件事:

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

然后打印出main a的内容。 a仍然在我们打电话给foo之前的位置。

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

相关内容

  • 没有找到相关文章

最新更新