2012-01-17 17 views
-1

コマンドストリームを読み込もうとしていますが、問題またはセグメント化エラーがコンパイルされています。私は私の構造体command_stream内のメンバーにアクセスしたいと思いますが、私はそれを実行すると、 "構造体または共用体ではないメンバーstream 'の要求:エラーまたはセグメント化エラーが発生します。私のコードはこのように見えます。エラー:構造体または共用体ではないメンバー 'ストリーム'を要求します。

typedef struct command_stream *command_stream_t; 

struct command_stream 
{ 
    int stream[100]; 
    int test;                                    
}; 

//get_next_byte is function that returns next byte in stream 
//get_next_byte_argument is pointer to FILE 

command_stream_t 
make_command_stream (int (*get_next_byte) (void *),void *get_next_byte_argument) 
{ 

    command_stream_t * ptr = checked_malloc(sizeof(struct command_stream)); 
    int c; 
    int count = 0; 
    while((c = get_next_byte(get_next_byte_argument)) != EOF) 
    { 

     //(*ptr)->stream[0] = 0; 
     //(*ptr)->test = 0;                                 
     //ptr->test = 0; 
     //ptr->stream[count] = c; 
     count++; 
     break; 
    } 
    return 0; 
} 

/////////////////////

checked_mallocは、本質的にmalloc関数である関数です。 get_next_byteは基本的にgetcで、ファイル内の次の文字を取得します。 問題はptrから発生しています。 ptr-> testまたはptr-> stream [count]を実行しようとすると、構造体または共用体ではないメンバーのストリーム要求がエラーになります。 (* ptr) - > stream [0]または(* ptr) - > testを試しても、コンパイルエラーはありませんが、セグメント化エラーが発生します。どうしましたか?

+0

コンパイルするかどうか、どちらですか?あなたが言った "しかし、私はエラーを取得するか...またはセグメンテーションフォールト" –

答えて

1

あなたの型宣言は、使用方法と一致しません。 structへのポインタとしてcommand_stream_tを定義するtypedefがあるので、あなたの変数ptrは実際にはstructへのポインタへのポインタです。 typedefから*を削除するか、ptrの宣言から*を削除する必要があります。

1

ptrは、タイプcommand_stream_t*であり、struct command_stream **と同じです。 ptrのタイプがcommand_stream_t*になるようにしたい場合は、typedefをtypedef struct command_stream* command_stream_tから​​に変更する必要があります。これを行うことで、あなたが望むようにptr-><field>を使用します。

つまり、(*ptr)-><field>は有効なアドレスを返しません。したがって、segfault。

関連する問題