2016-08-03 245 views
1
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」?

爲什麼這個程序在運行時沒有崩潰?

+6

因爲C給你足夠的繩索來吊死你自己。 – Idos

+1

刪除'x =(int *)malloc(sizeof(int));','%d' - >''%d \ n「' – BLUEPIXY

+1

不要將malloc的結果強制轉換爲C,並使用sizeof * x)而不是sizeof(int)。 – Caw

回答

6

語法上的代碼沒有問題,所以它編譯。

將地址y傳遞給該函數。保存地址爲y的函數中的指針x被malloc分配的有效內存地址覆蓋。隨着指針的值發生更改,寫入int時不會寫入y。然後函數返回(fun中分配的內存確實'泄漏')。

y在主要的價值保持不變。

該程序的行爲已定義。

+0

@ user3781974您的問題中的代碼中有幾個拼寫錯誤。請修復它們。 – 2501

3

嘿,你正在傳遞變量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); 
} 
+2

你給的例子是錯誤的,因爲內存被分配給'main'中'y'和'y' remians _uninitialized_的副本。所以基本上它有** _未定義的行爲_ **。 – ameyCU

+0

@ameyCU謝謝 –

+0

爲什麼你會使用雙重間接?爲什麼不'void fun(int * x){* x = 20; }'並且傳遞'int y;有趣的(&y);'in main? –

1
x=(int*)malloc(sizeof(int)); //x point to a new addr. 

*x = 20; // change value of new pointer 

刪除該行x=(int*)malloc(sizeof(int));,那麼它會工作。

0

我想你想要做的是改變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; 
    } 

但上面的代碼會做。

相關問題