2013-02-21 74 views
0

對於我的網絡類,我們正在構建基於UDP協議的BitTorrent客戶端,這非常酷,但由於某些原因,我在C字符串方面遇到了很多麻煩。char *數組不保留價值C

我第一次收到一個數據包時,我做的:

if(server_data == NULL){ 
    server_data = malloc(one_block.total_blocks*sizeof(char*)); 
    int i; 
    for(i = 0; i < one_block.total_blocks; i++){ 
     server_data[i] = malloc(sizeof(char*)); 
     server_data[i] = ""; 
    } 
} 

這裏,SERVER_DATA是char**和one_block是struct保存數據包信息和有效載荷。

接下來我做的:

server_data[one_block.which_block] = one_block.payload; 
blocks_rcv++; 
if(blocks_rcv == one_block.total_blocks-1) 
    done = TRUE; //macro 
if(done){ 
    int i; 
    for(i = 0; i < one_block.total_blocks; i++){ 
     printf("%s", server_data[i]; 
    } 
} 

一切似乎很好,很正常,但任何瘋狂的原因,當我收到的所有數據包之前打印SERVER_DATA的內容,我看到每個數據包不同的數據。之後,我設置了done = TRUE並進入for循環,數組中的每個點都包含相同的字符串值。

我不知道爲什麼會發生這種情況,我真的很想了解從開始到結束,數組內容如何變化,儘管我通過讀入的循環的每次迭代來驗證它們一次一個數據包。

+2

'server_data [i] =「」;/*內存泄露* /' – FatalError 2013-02-21 05:26:34

+0

如果你做'malloc(sizeof(char *));'你只分配四個或八個字節。 – 2013-02-21 05:41:06

回答

3

這條線的問題是:

server_data[i] = ""; 

覆蓋分配的指針,有一個指向字符串常量。由於字符串文字無法修改,如果您稍後複製到此指針中,您會遇到未定義的行爲

如果你想確保字符串爲空,要麼使用calloc,第一個字符設置爲'\0',或在新的字符串中使用strcpy副本

+0

是的,沒有解決它。 – barndog 2013-02-21 05:36:40

+0

@shadow然後你需要顯示你在你分配和你打印的內容。 – 2013-02-21 05:39:12

+0

這就是我所做的。而已。 – barndog 2013-02-21 05:39:27

0

有幾個問題會在這裏:

1)首先,SERVER_DATA,如果它被聲明爲一個char **,可能會或可能不會是空的蝙蝠,除非你聲明它如此。我不確定你是否將它初始化爲NULL。明確地將它初始化爲NULL是一個好主意。

2)我不知道如果你打算爲數組server_data的每個項目持有一個char *(換句話說,一個字符串的引用),或者該數組是一個字符串本身。是one_block.payload一個字符串,或一組指針字符串?

我用一些測試值運行你的代碼,我個人沒有得到任何意外的值的問題......我認爲這個問題可能是如何建立持有有效載荷數據的結構。你能告訴我們你的one_block結構嗎?什麼類型的變量/數組是one_block.payload?

+0

謝謝,但我已經明白了@Joachim Pileborg。它必須處理不合適的數量,而不是使用strcpy。 – barndog 2013-02-21 08:05:16