void fun(int* x){
x=(int*)malloc(sizeof(int));
*x = 20;
}
int main(){
int y=31;
fun(&y);
printf(%d,y);
}
为什么这段代码能够成功编译?我在线看到问题: x =(int *)malloc(sizeof(int));为什么此代码不打印“20”?
为什么这个程序在运行时没有崩溃?
void fun(int* x){
x=(int*)malloc(sizeof(int));
*x = 20;
}
int main(){
int y=31;
fun(&y);
printf(%d,y);
}
为什么这段代码能够成功编译?我在线看到问题: x =(int *)malloc(sizeof(int));为什么此代码不打印“20”?
为什么这个程序在运行时没有崩溃?
语法上的代码没有问题,所以它编译。
将地址y
传递给该函数。保存地址为y
的函数中的指针x
被malloc分配的有效内存地址覆盖。随着指针的值发生更改,写入int时不会写入y
。然后函数返回(fun
中分配的内存确实'泄漏')。
y
在主要的价值保持不变。
该程序的行为已定义。
@ user3781974您的问题中的代码中有几个拼写错误。请修复它们。 – 2501
嘿,你正在传递变量y的地址的副本,这是在堆栈上推送。您只需通过分配由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);
}
你给的例子是错误的,因为内存被分配给'main'中'y'和'y' remians _uninitialized_的副本。所以基本上它有** _未定义的行为_ **。 – ameyCU
@ameyCU谢谢 –
为什么你会使用双重间接?为什么不'void fun(int * x){* x = 20; }'并且传递'int y;有趣的(&y);'in main? –
x=(int*)malloc(sizeof(int)); //x point to a new addr.
*x = 20; // change value of new pointer
删除该行x=(int*)malloc(sizeof(int));
,那么它会工作。
我想你想要做的是改变main
函数中变量y
的地址。你不能通过将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;
}
但上面的代码会做。
因为C给你足够的绳索来吊死你自己。 – Idos
删除'x =(int *)malloc(sizeof(int));','%d' - >''%d \ n“' – BLUEPIXY
不要将malloc的结果强制转换为C,并使用sizeof * x)而不是sizeof(int)。 – Caw