如何更改函数中参数的值

时间:2013-11-13 06:48:30

标签: 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;    

}

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

4 个答案:

答案 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更改为不同的值,即现在为我们保留的内存区域的地址。但是,xfoo的本地变量。当foo结束时,x消失,我们返回main。发生了两件事:

  1. 我们已经分配了一些内存,
  2. 我们已为其指定了一个值。
  3. 然后打印出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,这是一个多余的非标准标题。