void fun(int* x){
x=(int*)malloc(sizeof(int));
*x = 20;
}
int main(){
int y=31;
fun(&y);
printf(%d,y);
}
为什么这段代码能够成功编译?
评论:它是在Eclipse上编译的 我在网上看到了问题: X =(INT *)malloc的(的sizeof(int)的);
为什么这个程序没有在运行时崩溃?
答案 0 :(得分:6)
语法代码没有任何问题,因此编译。
y
的地址传递给该函数。保存地址x
的函数中的指针y
被malloc分配的有效内存地址覆盖。当指针的值发生变化时,会在那里写入一个int而不是y
。然后函数返回(fun
中分配的内存“泄漏”)。
主要y
的值保持不变。
定义了该程序的行为。
答案 1 :(得分:3)
malloc
返回的地址并通过将值20复制到该地址来操纵指针(在指针被推动的位置)
*x = 20
对main
中的变量没有影响,即y
如果您想要打印20,这可能会有所帮助
void fun(int** x){
*x=(int*)malloc(sizeof(int));
**x = 20;
}
int main(){
int *y;
fun(&y);
printf("%d",*y);
}
答案 2 :(得分:1)
x=(int*)malloc(sizeof(int)); //x point to a new addr.
*x = 20; // change value of new pointer
删除行x=(int*)malloc(sizeof(int));
,然后就可以了。
答案 3 :(得分:0)
我想您想要做的是更改y
函数中变量main
的地址。你不能通过将y
的地址值传递给函数来做到这一点。因为y
的地址根本没有分配操作。在您的示例中,y
的地址没有变量(基本上是指针)(忘了分配)。
int* fun(int* x){
printf("Fun before %p - %d\n", x, *x);
x = malloc(sizeof(int));
*x = 20;
printf("Fun after %p - %d\n", x, *x);
return x; // return your new address
}
int main(){
int *y = malloc(sizeof(int));
*y = 31;
printf("Main before %p - %d\n", y, *y);
y = fun(y); // assign your new address here
printf("Main after %p - %d\n", y, *y);
return 0;
}
但上面的代码可以。