2012-12-16 77 views
0

分配內存的結構我有一個struct稱爲國家:使用malloc

typedef struct State{ 
    char alphabets[2][6]; 
    struct State *PREV; /*this points to the previous state it came from*/ 
    struct State *NEXT; /*this points to the next state in the linked list*/ 
    int cost; /*Number of moves done to get to this position*/ 
    int zero_index;/*this holds the index to the empty postion*/ 
} State; 

這裏是我的memAllocator()方法:

memAllocator(){ 
struct State *p = (State*) malloc(sizeof(State)); 
if (p==NULL){ 
     printf("Malloc for a new position failed"); 
     exit(1); 
} 
return p; 

} 這是我的主要方法。

main(){ 
State *start_state_pointer=memAllocator(); 
State start_state; 
start_state.zero_index=15; 
start_state.PREV = NULL; 
start_state.alphabets[0][0]='C'; 
start_state.alphabets[0][1]='A'; 
start_state.alphabets[0][2]='N'; 
start_state.alphabets[0][3]='A'; 
start_state.alphabets[0][4]='M'; 
start_state.alphabets[0][5]='A'; 
start_state.alphabets[1][0]='P'; 
start_state.alphabets[1][1]='A'; 
start_state.alphabets[1][2]='N'; 
start_state.alphabets[1][3]='A'; 
start_state.alphabets[1][4]='L'; 
start_state.alphabets[1][5]='_'; 
start_state_pointer=&(start_state); 
/*start_state=*start_state_pointer;*/ 

}

我想聲明start_state_pointer = &(start_state);只是將指針start_state_pointer分配給在狀態start_state期間創建的少量臨時空間,而不是分配給我分配的空間。 但是,當我嘗試註釋掉語句start_state = * start_state_pointer尊重指針並分配空間開始狀態。它給了我一個分段錯誤。

我剛剛開始在C.可以有人幫助我呢?

+1

你想做什麼?這一行,'start_state_pointer =&(start_state);',拋出唯一指向分配內存的指針,永遠丟失它。 –

+0

我試圖編譯你的代碼,並且得到了很多錯誤:http://codepad.org/RFQi7oHH/raw.txt – melpomene

+0

我基本上試圖填充我用一個狀態創建的內存。即我想複製start_state並將其全部包含到新分配的內存中。 – user1452307

回答

0

您的memAllocatormain函數沒有明確的返回類型。這種代碼風格已被棄用超過10年。 C中的函數應始終具有返回類型。對於main,返回類型應該是int,對於您的memAllocator函數,應該是State *

的第二個問題是,你分配一個State結構空間,但後來補不同State結構,並覆蓋指針使用start_state_pointer = &(start_state);先前分配State結構。

要使用剛纔分配的內存,你要使用這樣的事:

State *start_state = memAllocator(); 
start_state->zero_index = 15; 
start_state->PREV = NULL; 
start_state->alphabets[0][0] = 'C'; 
// etc. 

沒有必要創建兩個State結構。當您在原始代碼中使用State start_start;時,您正在創建一個名爲自動存儲的結構。這意味着這個結構體的空間會自動分配,並且會在它聲明的範圍末尾爲您自動釋放。如果您將此結構體的地址傳遞給您的程序的其他部分,那麼您將通過圍繞着一個指向釋放結構的指針,這可能是你的程序崩潰的原因。