2016-06-10 61 views
0

我一直在嘗試c一段時間,但我無法處理指針數組。
例如添加一個字符串指針指針指向c中沒有顯示任何東西時訪問

char *word; 
char *container[100]; 

在的字符串臨時下面的for循環我正在追加單個字符然後我想要添加到容器* [100]如果定界符。出現

#include <stdio.h> 
#include <stdlib.h> 
#include <unistd.h> 
#include <string.h> 


int main() 
{ 
    int z = 0; 
    int k=0; 
    char *word; 
    char *container[100]; 
    char *in = " First Word . Second Word"; 
    for(k=0; k<strlen(in); k++) 
    { 
     //using . as a delimiter 
     if(in[k]=='.') 
     { 
      container[z] = word; 
      printf("%s\n", container[z]); //<---- this prints okey inside loop 
      z++; 
      memset(word,0,strlen(word)); 
     } 
     else 
     { 
      //appending characters to temp, using some method 
      snprintf(word + strlen(word), (sizeof word) - strlen(word), "%c", in[k]); 
     } 
    } 
//doesnt print anything outside the loop 
printf("Does it print: %s\n", container[0]); 
printf("Doest it print: %s\n", container[1]); 

    return 0; 
} 

當我嘗試打印在容器它不顯示任何東西的話:

printf("%s\n", container[0]); 
printf("%s\n", container[1]); 

我想我已經做某種動態分配的。但我不知道如何。

+3

請發表[mcve] –

+2

更好地解釋你的代碼,什麼是溫度?容器[z] ??? –

+0

你把它錯了嗎? '容器[z]'應該做什麼? – Barmar

回答

1

指針word在開始使用它之前未被初始化。這會導致未定義的行爲。如果幸運的話,你會得到一個分段錯誤,所以你意識到了這個問題並且可以解決它。如果你不走運,它有點作用,但會產生奇怪的副作用,如神祕覆蓋其他變量。

此外,sizeof word返回指針大小,而不是它指向的(分配的)內存區域的大小。

word的問題可以通過固定使其成爲一個數組:

char word[100]; 

現在word包含100個字節的內存,我們可以安全地寫入,並sizeof word將評估爲100

下一個問題是當您將container指針指向word時。這將而不是作爲word中包含的字符串的副本。稍後當您覆蓋單詞的內容時,container[i]的內容也將被覆蓋,因爲它將指向相同的內存位置。您可以使用strdup創建一個動態分配的副本:

container[z] = strdup(word); 

注:strdup()是一個POSIX功能,而不是C規範的一部分。在沒有strdup()的平臺上,您可以使用malloc + strcpy執行相同的任務。

+0

yayy,修復它...我知道這是因爲內存的位置,但不知道它。非常感謝你爲我澄清這個概念。 :) –