2010-07-01 4 views
0

: точка ли полукокс, подписанный полукокс, или без знака, в конечном счете спорной здесь. было бы более целесообразно использовать memcpy в этой ситуации, так как она работает без разбора по байтам.конкатенация с strncat приводит к ошибкам в знаковости обновления

Не может быть более простой операции, но, похоже, мне не хватает критического шага. В следующем коде я пытаюсь заполнить bufferdatabuffer, для которого компилятор предупреждает меня о различии в подписи.

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

Вы действительно читаете строки? Если это так, «buffer» должен быть char. Если нет, вы не должны использовать strncat – nos

+0

+1 для этого. они действительно не являются строками, если nuls безудержно. переключился на memcpy и проблема решена. – bitcruncher

ответ

1

Очевидно, что в вашем компиляторе char является signed char, таким образом, появляется предупреждающее сообщение.

+0

Это неправильно. Вы должны использовать 'unsigned char', если вы хотите использовать неинтерпретированные байты, потому что только' unsigned char' и беззнаковые битовые поля гарантируются как чистое двоичное представление. –

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

так как ваш буфер назначения является неподписанным символом, поэтому будет предупреждение о знаке. Вы можете либо изменить свой буфер на массив символов, если подписка не нужна, иначе вы можете игнорировать предупреждения с использованием опции -w в компиляторе.