2011-10-27 23 views
0

Hy everyone,C通過參數返回答案(推薦)

請考慮這個小代碼,並幫我弄清楚,爲什麼它不工作?

#include <stdio.h> 
#include <stdlib.h> 

void setup(int* helo) { 
    helo = (int*) malloc(sizeof(int)); 
    (*helo) = 8; 
} 

int main(int argc, char* argv[]) { 
    int* helo = NULL; 
    setup(helo); 
    printf("Value: %s \n", (*helo)); 
    getchar(); 
    return 0; 
} 
+0

的problme是,當我試圖閱讀「直升機」,它仍然是NULL – barni

+0

是不是你基本上通過了「null」設置到建立?一旦進入設置狀態,你爲你的int分配新的內存 - 但是這個地址又是如何與調用者進行通信的呢? –

+0

它應該自動執行... – barni

回答

3

您正在查找兩個選項這裏。您可以佔用內存指針分配的方程,並通過一個標準的變量的內存地址:

void setup(int* helo) 
{ 
    *helo = 8; 
} 

int main(int argc, char* argv[]) { 
    int helo = 0; 
    setup(helo); 
    printf("Value: %d\n", helo); 
    getchar(); 
    return 0; 
} 

或者,如果你要堅持你的做法,你的功能需求籤名改變接收指針的指針:

void setup(int** helo) { 
    *helo = (int*) malloc(sizeof(int)); 
    *(*helo) = 8; 
} 

int main(int argc, char* argv[]) { 
    int* helo = NULL; 
    setup(&helo); 
    printf("Value: %d \n", (*helo)); 
    getchar(); 
    return 0; 
} 

這樣做的原因是,setup(int* helo)接收到複印在main()宣佈int* helo ,並且這個本地副本將指向相同的地方。所以無論你用helosetup()裏面做什麼都會改變本地副本的變量而不是helomain()。這就是爲什麼您需要將簽名更改爲setup(int** helo)

0

可以嘗試printf("Value: %d \n", (*helo));而不是printf("Value: %s \n", (*helo));

+0

它是一樣的,我得到NULL值,I不知道爲什麼,但在函數「malloc」工作正常,但它沒有返回值... – barni

0

c是按價值傳遞。當你傳遞一個參數給一個函數時,它的一個副本就會被創建。您需要接收指針作爲指針以實現通過引用傳遞C++特性。

void setup(int** helo) { 
    *helo = (int*) malloc(sizeof(int)); 
    (*(*helo)) = 8; 
} 

,並在將其稱爲 -

setup(&helo) ;