0

State という構造体があります。

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 を、割り当てたスペースではなく、State start_state 中に作成された少量の一時スペースに割り当てているだけです。しかし、コメントアウトされたステートメント start_state=*start_state_pointer を試して、ポインターを参照し、スペースを開始状態に割り当てようとすると。セグメンテーション違反が発生します。

私はCで始めたばかりです.誰かがこれを手伝ってくれますか?

4

1 に答える 1

0

memAllocator関数とmain関数には明示的な戻り値の型がありません。このスタイルのコードは、10 年以上非推奨になっています。C の関数には、常に戻り値の型が必要です。の場合main、戻り値の型は である必要がありintmemAllocator関数の場合は である必要がありますState *

2 つ目の問題は、構造体にスペースを割り当てた後、Stateの構造体を埋めて、以前に割り当てた構造体へのポインタを. StateStatestart_state_pointer = &(start_state);

割り当てたばかりのメモリを使用するには、次のようなものを使用します。

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

2 つの構造体を作成する必要はありませんStateState start_start;元のコードでを使用すると、自動ストレージと呼ばれるもので構造体が作成されます。これは、この構造体のスペースが自動的に割り当てられ、宣言されているスコープの最後で自動的に割り当てが解除されることを意味します。この構造体のアドレスを取得して、プログラムの他の部分に渡すと、渡します。割り当て解除された構造体へのポインターの周りにあり、これがプログラムがクラッシュする理由である可能性があります。

于 2012-12-16T00:59:09.047 に答える