我想知道为什么这段代码不起作用的技术原因(在内存方面):
#include <stdio.h>
#include <stdlib.h>
int* fun(int*);
int main()
{
int a=5;
int* ptr;
// ptr=(int*)malloc(sizeof(int));
fun(ptr);
a=*ptr;
printf("\n the val of a is:%d",a);
return 0;
}
void fun(int* ptr)
{
ptr = (int*)malloc(sizeof(int));
*ptr = 115;
}
Run Code Online (Sandbox Code Playgroud)
为什么这不起作用?我认为堆(更重要的是地址)对于堆栈中的所有函数变量是通用的.
另外,为什么这会起作用.如果我评论函数内部的内存分配乐趣并取消注释main中的内存分配.它工作正常.
Dev*_*lar 14
在C中,一切都按值传递.
你传递给fun()的是你在main()中的指针的副本.
这意味着ptr 的副本针对分配的内存,并且该内存设置为115.
main()中的ptr仍指向未定义的位置,因为它从未被分配过.
尝试将指针传递给指针,以便fun()您可以访问指针本身:
#include <stdio.h>
#include <stdlib.h>
int* fun(int**); // <<-- CHANGE
int main()
{
int a=5;
int* ptr;
// ptr=(int*)malloc(sizeof(int));
fun(&ptr); // <<-- CHANGE
a=*ptr;
printf("\n the val of a is:%d",a);
return 0;
}
int* fun(int** another_ptr) // <<-- CHANGE
{
*another_ptr = (int*)malloc(sizeof(int)); // <<-- CHANGE
**another_ptr = 115; // <<-- CHANGE
return *another_ptr;
}
Run Code Online (Sandbox Code Playgroud)
另一种选择是fun()实际返回更新的指针(如公布的那样),并将其分配给ptr:
#include <stdio.h>
#include <stdlib.h>
int* fun(int*);
int main()
{
int a=5;
int* ptr;
// ptr=(int*)malloc(sizeof(int));
ptr = fun(ptr); // <<-- CHANGE
a=*ptr;
printf("\n the val of a is:%d",a);
return 0;
}
int* fun(int* another_ptr)
{
another_ptr = (int*)malloc(sizeof(int));
*another_ptr = 115;
return another_ptr; // <<-- CHANGE
}
Run Code Online (Sandbox Code Playgroud)
编辑:我重命名了变量,fun()以明确它与您使用的变量不同main().同名在这里没有任何意义.