2010-07-01 50 views
0

更新:char,signed char或unsigned是否最終在這裏進行討論。在這種情況下使用memcpy更爲合適,因爲它在字節上不加區分地工作。與strncat字符串連接導致簽名錯誤

不可能是一個更簡單的操作,但我似乎錯過了關鍵的一步。在下面的代碼中,我試圖用buffer來填充bufferdata,編譯器提醒我注意簽名的不同。

unsigned char buffer[4096] = {0}; 
char *bufferdata; 

bufferdata = (char*)malloc(4096 * sizeof(bufferdata)); 

if (! bufferdata) 
    return false; 

while(...) 
{ 
    // nextBlock(voidp _buffer, unsigned _length); 
read=nextBlock(buffer, 4096); 

if(read > 0) 
{ 

    bufferdata = strncat(bufferdata, buffer, read); // (help) 
    // leads to: pointer targets in passing argument 2 of strncat differ in signedness. 

    if(read == 4096) { 

    // let's go for another chunk 
    bufferdata = (char*)realloc(bufferdata, (strlen(bufferdata) + (4096 * sizeof(bufferdata)))); 
    if (! bufferdata) { 
    printf("failed to realloc\n"); 
    return false; 
    } 

    } 

} 
else if(read<0) 
{ 
    printf("error.\n"); 
    break; 
} 
else { 
    printf("done.\n"); 
    break;  
} 
} 
+1

你真的在看字符串嗎?如果是這樣,'緩衝'應該是字符。如果沒有,你不應該使用strncat – nos 2010-07-01 07:52:57

+0

+1。他們真的不是字符串,如果nuls猖獗。切換到memcpy並解決問題。 – bitcruncher 2010-07-03 15:32:39

回答

1

很顯然,在你的編譯器charsigned char,從而警告消息。

+0

這是錯誤的。如果您想要未解釋的字節,則必須使用'unsigned char',因爲只有'unsigned char'和無符號位域保證是純二進制表示。 – 2010-07-01 08:48:41

1
char * strncat (char * destination, char * source, size_t num); 

因此,您的目標緩衝區是無符號字符,因此會出現符號警告。如果不需要簽名,則可以將緩衝區更改爲char數組,否則可以在編譯器中使用-w選項忽略警告。