2012-01-17 43 views
-1

我想做一個命令流來閱讀,但我正在編譯問題或分段錯誤。我想訪問我的struct command_stream中的成員,但是當我運行它時,我會得到「error:request for member'stream'in not a structure or union」或分段錯誤。我的代碼看起來像這樣。錯誤:請求成員'流'的東西不是一個結構或工會

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],我會在「不是結構體或聯合體」的東西中看到錯誤「request for member'stream'」。 如果我嘗試(* ptr) - >流[0]或(* ptr) - >測試,沒有編譯錯誤,但我得到了分段錯誤。怎麼了?

+0

它或者編譯或者它不 - 這是它?你說過「但我會得到錯誤......或者分段錯誤」 – 2012-01-17 01:12:11

回答

1

您的類型聲明與您的使用不一致。因爲你的typedef定義了command_stream_t作爲指向struct的指針,這意味着你的變量ptr實際上是一個指向結構指針的指針。您需要從您的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>不會返回一個有效的地址。因此段錯誤。

相關問題