Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/three.js/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 如何更改函数中参数的值_C_Malloc - Fatal编程技术网

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
    s
    a
    的内容<代码>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++的东西。