2015-12-06 58 views
2

所以我的工作在C堆棧的實現利用結構,下面的事情是困擾我Struct對象名稱在C指針

typedef struct { 
    int vrh, polje[MAXSTOG]; 
} Stog; 

void init_stog(Stog *stog) { 
    stog->vrh = -1; 
} 

int dodaj(int element, Stog *stog) { 
    if(stog->vrh == MAXSTOG-1) { 
     return 0; 
} 

stog->vrh++; 
stog->polje[stog->vrh] = element; 

return 1; 
} 

int skini(int *element, Stog * stog) { 
    if(stog->vrh < 0) 
     return 0; 
    *element = stog->polje[stog->vrh]; 
    stog->vrh--; 
    return 1; 
} 

int main(){ 

    Stog *stog; 
    init_stog(stog); 
    dodaj(5, stog); 
    dodaj(3, stog); 
    dodaj(2, stog); 

    int a; 
    skini(&a, stog); 
    printf("%d ", a); 
    skini(&a, stog); 
    printf("%d ", a); 
    return 0; 
}  

爲什麼Stog * stog;作品,即使指針不指向任何東西。我知道Stog是object_name,並且它已經實例化,所以只會將該指針指向實例化的struct,但我不明白添加指針時的語法,並且我無法在任何地方找到解釋。

你能解釋一下,我只是一個c語法的東西,或者我誤解了一些東西?

+0

C? C++?請選擇。 – deviantfan

+0

順便說一句,用英文名稱,你的代碼會更容易理解。 – deviantfan

+0

這是C,沒想到把它轉換成英文,因爲它只有幾行代碼,我寫了它是棧實現,所以它不那麼難理解 – Zorkan

回答

4

它「錯誤地工作」(這是另一種說法「它不起作用」的方式)。

當你開始你的程序時,變量stog有一些隨機的位組合。您的程序將該組合解釋爲地址,並開始將數據寫入其中。當你運氣好時,你的程序就會崩潰,所以你知道需要修正一些東西。

當你運氣不好時,程序運行完成,甚至產生預期的輸出。該程序不正確,但需要修復。特別是,它可能不會運行在不同的硬件上,或者可能在下次運行時產生不同的結果或崩潰。您可以使用內存分析工具(例如valgrind)來查找類似的隱藏錯誤。

修復程序的一種方法是將stog作爲變量聲明,而不是指針,並在需要指針時傳遞&stog

4

你目前的行爲是未定義的行爲。你正在使用未初始化的指針並使用它,就像它指向一個實際的結構。正如名字所說,行爲是不確定的,任何事情都可能發生。它現在可能適用於你,但在某個計算機上,某個地方,完全相同的代碼可能會使事情崩潰,爆炸或更糟。所以你可以在這種情況下稱自己爲幸運,但我會更新你的代碼,使你的指針實際上指向某個有效的地方。