2012-12-02 71 views
1

從本質上說,這個代碼能工作嗎?在你說「運行並看看!」之前,我剛剛意識到我的cygwin沒有帶有gcc,現在距離重新安裝完成40分鐘。話雖這麼說:char []和char *兼容性?

char* words[1000]; 
for(int i = 0; i<1000; i++) 
    words[i] = NULL; 

char buffer[ 1024 ]; 

//omit code that places "ADD splash\0" into the buffer 

if(strncmp (buffer, "ADD ", 4) == 0){ 
      char* temp = buffer + 4; 
      printf("Adding: %s", temp); 
      int i = 0; 
      while(words[i] != NULL) i++; 
      words[i] = temp; 
} 

我主要是不確定的線char* temp = buffer + 4,以及是否我可以分配字[我]在我的方式。當我最終嘗試在40分鐘內完成編譯時,我是否會遇到類型錯誤?

此外,如果這樣做,爲什麼我不需要在單詞[]的每個元素上使用malloc()?爲什麼我可以說words[i] = temp,而不是需要爲單詞[i]分配內存的時間長度?

+0

'char * words [1000] = {0}'將初始化它而不進行循環。 –

回答

0

這可能不會起作用,因爲所有words[i]將被設置爲指向buffer + 4的相同確切位置。

但是,您的基本想法很好:您可以通過遵循相同的基本思路將「大型緩衝區」分解爲更小的「單詞」。但是,您需要確保您不指向緩衝區的相交區域,並且指向您的單詞的區域以null結尾。

最後,雖然走路到words[i]找到下一個NULL每一次的想法是不理想的:你應該存儲最近位置,它是你寫的,增加它在下一個寫,並刪除while(words[i] != NULL)循環。

+0

我理解你的第三段,但第一部分讓我不確定如何繼續。我明白你的觀點 - '我將'指出可能會改變的內存位置。那麼我怎樣才能製作一個副本呢? 'strcpy(temp,buffer + 4)'有效嗎? – Aerovistae

+1

@Aovovistae我的理解是,你打算在循環中執行if(strncmp ...)代碼,如果'buffer'被分配在靜態內存中(靜態或全局),你不需要複製它內容或使用'malloc';另一方面,如果它是本地的,則需要使用'strdup'或'malloc''' memcpy'或'strcpy'來避免引用不穩定。 – dasblinkenlight

0

char[]衰減到char*函數調用和指針算術。

所以從一眼,你的代碼是有效的C.

編輯

至於你的問題補充,你可以做word[i] = temp因爲類型兼容。編譯器只檢查類型安全性(好吧,它確實更多,但是爲什麼這是一個語法上有效的賦值......)。

+0

剛剛添加了一個部分給我的問題。 – Aerovistae

0

在gcc上測試它,它會工作,但是除非你使用c99編譯器,否則你需要在for循環之外聲明我。

+0

剛剛在我的問題中增加了一個部分。 – Aerovistae

0

關於你的問題的最後一部分 - wordsarray of pointers to character strings,寫words[i] = temp使得該陣列指向字符串tempith元素。

只要您不需要創建temp [我]應該指向的臨時副本,則不需要malloc新內存。