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