2013-01-18 86 views
1

這似乎是一個非常簡單的問題,但我無法弄清楚哪個部分導致了它。基本上,我有隻包含字符串C - 將信息傳遞給一個結構體(特別是一串字符串)

struct command_stream{ 
    char **tokens; 
}; 

typedef struct command_stream *command_stream_t; 
command_stream_t test; 

陣列再後來就一個結構,我解析某些字符串爲較短的,用字符串的另一個數組結束

char **words = *array of strings* 

字包含正確的我想要的信息,我打開並打印出每個元素,以確保我沒有收到錯誤的字符串。所以現在我只需要將單詞指向單詞

test->tokens = words; 

但它給了我一個段錯誤。我不知道爲什麼。他們都是指針,所以除非我錯過了一些明顯的...

編輯:作爲一個整體的函數必須返回一個指針,這就是爲什麼它被設置爲這樣,我一直忘記。但我想我已經知道了,如果我只是創建一個新的typedef

typedef struct command_stream command_stream_s; 
command_stream_s new_command_stream; 

,就回到 & new_command_stream; 這應該是正確的?儘管new_command_stream本身不是指針。

+1

發佈完整的代碼,足以重現問題。 –

回答

2

從你的代碼摘錄,似乎你還沒有聲明的結構。你已經成功地聲明瞭一個指向struct command_stream_t test;的指針,但是這個指針還沒有指向任何地方。

您需要以某種方式爲您的結構分配內存,並使test引用它。例如:

command_stream_t test = 
     (command_stream_t) malloc(sizeof(struct command_stream)); 

這樣你就可以成功地使用:

test->tokens = words; 

,你打算。

請注意,您不需要使用malloc來分配內存。只要指針具有與之關聯的內存,指針就可以引用局部/全局變量(如果使用局部變量,則不使用該變量聲明範圍外的指針)。

+0

是的。在爲該變量賦值之前,您不能使用變量的值。 'test-> tokens'使用'test'的值,但沒有'test = ;'任何地方都可以找到。 –

+1

@DavidSchwartz確實如此。這是我不願意在typedef中「隱藏」指針的原因之一。看到像'command_stream_t foo'這樣的東西可能會促使我相信'foo'是一個完整的變種,當它不是時。 –

+0

哦,哎呀。這是一個更大的任務的一部分,我一直忘記他們需要我們返回一個指針,這就是爲什麼它是這樣設置的。所以如果我像typedef struct command_stream command_stream_s(它不是​​一個指針)並且剛剛返回&new_command_stream那麼它應該可以工作。 – user1777900

1
typedef struct command_stream *command_stream_t; 
command_stream_t test; 

這使「測試」成爲一個指針。沒有爲結構分配內存。 您需要的結構,然後才能提領說來分配內存,使測試指針指向的內存塊 -

test->tokens = words; 

這樣做:

typedef struct command_stream command_stream_t; 
command_stream_t test; 

test.tokens = words; 

所不同的是,command_stream_t不再是指針類型,而是實際的結構。

相關問題