2010-07-01 23 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选项忽略警告。