2014-12-07 64 views
1

我有兩個文件,main.cmain2.c。我的經驗告訴我他們應該完全一樣,但他們不應該。如何理解函數中的指針

main.cmain例程之外聲明瞭一個全局變量。然後,在main例程中,聲明一個指針並將其定義爲指向該全局變量。全局變量被改變,並且局部變量的值被打印到屏幕上。

main2.c也是這樣,但將局部到全局的定義和全局變量值的變化卷積到另一個函數change_number

我不明白爲什麼這種方法失敗。 main.cmain2.c是幾個小時的錯誤修復,文檔和教程閱讀的結果,顯然,閱讀這裏SO。

我對指針的理解是我稱之爲基礎的:它指向一個內存位置。在常規變量的情況下,指針將指向該變量的內存位置。幾個指針可以指向同一個內存位置,但是一個指針不能指向多個位置。

在C中沒有傳遞引用的東西,但據我所知,這不是通過引用傳遞的,因爲所有變量和指針都是在函數外部定義的。請賜教。

//File: main.c 
#include <stdio.h> 
#include <stdlib.h> 

int global_number; 

int main() { 
    int *local_number; 
    local_number = &global_number; 
    global_number = 9; 
    printf("local_number = %d\n", *local_number); 

    return 0; 
} 

輸出:「local_number = 9」。這是預期的結果。

//File: main2.c 
#include <stdio.h> 
#include <stdlib.h> 

int global_number; 

void change_number(int *number) { 
    number = &global_number; 
    global_number = 9; 
} 

int main() { 
    int *local_number; 
    change_number(local_number); 
    printf("local_number = %d\n", *local_number); 

    return 0; 
} 

輸出:「分段錯誤」。這顯然不是有意的。代碼運行良好,直到printf()。

+1

C使用通逐值。 'change_number'中的'number'是與main中的'local_number'不同的變量。 – 2014-12-07 02:16:18

+0

[變量在函數中未被調用方看到的可能的重複?](http://stackoverflow.com/questions/27320240/variable-changed-in-function-not-seen-by-caller) – 2014-12-07 02:17:37

+0

這一行:number = &global_number;應該是:* number =&global_number I.E. number是一個指向local_number的指針。代碼需要設置數值指針所指向的值 – user3629249 2014-12-07 02:39:45

回答

3

你永遠不會在第二個程序中初始化local_number。它沒有指向任何地方,訪問時會崩潰。嘗試

int *local_number = &global_number; 

則該值應該改變

要有change_number也初始化LOCAL_NUMBER,通過LOCAL_NUMBER的地址和改變指向的指針

void change_number(int **number) { 
    *number = &global_number; 
    global_number = 9; 
} 

... 
int *local_number; 
change_number(&local_number); 
+0

謝謝,這確實使代碼工作。我想我預計,因爲指針被聲明,我通過指針,我可以在函數中定義它。 – Alrekr 2014-12-07 02:48:52

+0

您的編輯完全符合我的要求。再次感謝! – Alrekr 2014-12-07 02:49:18