2013-07-15 131 views
8

我剛剛開始學習C,我一直在使用MinGW for Windows運行一些簡單的程序來理解指針如何工作。我試過如下:直接將值分配給C指針

#include <stdio.h> 

int main(){ 
    int *ptr; 
    *ptr = 20; 
    printf("%d", *ptr); 
    return 0; 
} 

其正確的編譯,但是當我運行可執行它不工作 - 該值不會被打印到命令行,而不是我得到的.exe文件發出錯誤訊息已停止工作。

然而,當我試圖在一個int變量並分配* ptr轉到該變量的存儲器地址存儲的值,如下所示:

#include <stdio.h> 

int main(){ 
    int *ptr; 
    int q = 50; 
    ptr = &q; 
    printf("%d", *ptr); 
    return 0; 
} 

它工作正常。

我的問題是,爲什麼我無法直接設置文字值的指針?我已經在線查看了教程,其中大部分都和第二個例子一樣。

任何幫助表示讚賞。

+0

指針未初始化的原因 - 它可能指向幾乎任何地方並可能導致程序崩潰。 – Till

+1

你很幸運,它終止了一個錯誤。 – JonnyRo

+1

@JonnyRo是對的。在真實的代碼中,這種錯誤往往會導致爲期一週的調試會話,試圖找出爲什麼其他變量每隔一段時間就會隨機更改一次(從不在實際測試它時,總是在做時公開演示)或安全漏洞,通過操縱不同的值來將「is_admin」標誌設置爲true。 – abarnert

回答

20

問題是你沒有初始化指針。你已經創建了一個指向「你想要的任何地方」的指針,這個指針可以是其他變量的地址,也可以是你的代碼的中間,或者是一些根本沒有映射的內存。

您需要在內存中的某個位置創建一個int變量,指向int *變量。

你的第二個例子是這樣做的,但它做了其他與這裏無關的事情。下面是你需要做的最簡單的事情:

int main(){ 
    int variable; 
    int *ptr = &variable; 
    *ptr = 20; 
    printf("%d", *ptr); 
    return 0; 
} 

這裏,int變量沒有被初始化,但是沒有關係,因爲你只是打算更換任何價值在那裏與20。關鍵是指針被初始化爲指向variable。事實上,你可以只分配一些原始內存爲指向,如果你想:

int main(){ 
    void *memory = malloc(sizeof(int)); 
    int *ptr = (int *)memory; 
    *ptr = 20; 
    printf("%d", *ptr); 
    free(memory); 
    return 0; 
} 
1

在第一個例子,PTR尚未初始化,使其指向一個未指定的存儲位置。當你爲這個未指定的位置分配一些東西時,你的程序就會爆炸。

在第二個示例中,當您說ptr = & q時設置地址,所以你沒問題。

7

的第一個程序與評論

#include <stdio.h> 

int main(){ 
    int *ptr;    //Create a pointer that points to random memory address 

    *ptr = 20;   //Dereference that pointer, 
          // and assign a value to random memory address. 
          //Depending on external (not inside your program) state 
          // this will either crash or SILENTLY CORRUPT another 
          // data structure in your program. 

    printf("%d", *ptr); //Print contents of same random memory address 
          // May or may not crash, depending on who owns this address 

    return 0;    
} 

第二個程序與評論

#include <stdio.h> 

int main(){ 
    int *ptr;    //Create pointer to random memory address 

    int q = 50;   //Create local variable with contents int 50 

    ptr = &q;    //Update address targeted by above created pointer to point 
          // to local variable your program properly created 

    printf("%d", *ptr); //Happily print the contents of said local variable (q) 
    return 0; 
} 

最關鍵的是,直到你知道它是分配給您自己已管理的地址,則無法使用指針,無論是通過將它指向您創建的另一個變量或malloc調用的結果。

之前使用它創建的代碼依賴於未初始化的內存,它最多會崩潰,但在最糟糕的情況下有時會工作,因爲隨機內存地址恰好在您的程序已擁有的內存空間內。如果它覆蓋你在程序中其他地方使用的數據結構,上帝會幫助你。

+1

好的例證。 – abarnert