2017-06-29 40 views
-6

我做出somefile.h一個typedef結構和somefile.c聲明爲使用「 - >」代替「。」。訪問結構賦予段錯誤

somestruct *mystruct; 

somevar = mystruct->variable; 

然後訪問它會產生「段錯誤」(可能因爲有一個「while」循環,因此StackOverflow)。 但是,如果我使用它作爲

somestruct mystruct; 
somevar = mystruct.variable; 

然後沒有問題。

最新錯誤?

+12

你有沒有爲'* mystruct'分配任何內存?指針只是一個指針,不會自動附加任何對象... –

回答

4

somestruct *mystruct定義一個指針somestruct類型的內存,並且不指向任何東西,或者如果它是局部變量,那麼它沒有被初始化好,這是未定義行爲

如果你這樣做somestruct mystruct然後你定義結構本身,而不是一個指針(對象存在於內存中)。

要使用指針訪問,你應該保留內存爲你的結構,如:

somestruct *mystruct = malloc(sizeof(*mystruct)); 
mystruct->variable = 5; 

或者你也可以這樣做:

somestruct mystruct; //Create my structure in memory 
somestruct *mystruct_ptr = &mystruct; //Create pointer to that structure and assign address 
mystruct_ptr->variable = 10; //Write to mystruct using pointer access 
0

如果下面的產生段錯誤:

somestruct *mystruct; 
somevar = mystruct->variable; 

這可能是所有的代碼。第一行只是將指針定義爲somestruct。指針未初始化,它指向一些未定義的位置。沒有任何類型的實際對象somestruct

取消引用此指針不確定的行爲 - 你的程序將嘗試從讀/寫一些不知名的地點,操作系統威力抓這一點,並用分段故障殺死你的計劃。

要實際使用指針,它必須指向某個對象。如果你有一些somestruct的地方,你可以讓你的指針指向的是:

somestruct foo; 
somestruct *mystruct = &foo; 
somevar = mystruct->variable; 

如果你想創建somestruct,你可以做一個動態分配(包括stdlib.h):

somestruct *mystruct = malloc(sizeof(*mystruct)); 
// use *mystruct 
// when done, don't forget: 
free(mystruct);