Я создаю временный буфер и копирую строку в буфер с помощью sprintf. Затем я вызываю функцию analysisRecordForPGDBOperation, передавая буфер в качестве параметра. I Разбор строки с помощью strtok с использованием | как разделитель. Я вижу странную проблему, когда значение кодового кода повреждено позже, хотя оно правильно напечатано в корпусе переключателя 2. Значение кода не соответствует, когда я печатаю в случае 3 и в случае 4.Переменная повреждение данных с C GCC на Fedora 17 64 бит
Я попытался увидеть резонанс для он в gdb, используя часы на переменной codeite, я получаю следующий вывод, но я не уверен, почему я получаю эту проблему.
[корень @ pe1800xs64 ствол] # uname -r 3.9.10-100.fc17.x86_64
"Выход из GDB:"
Прежнее значение = "71663138" , '\ 000' Новое значение = "\ 000 \ 061 \ 066 \ 066 \ 063 \ 061 \ 063 \ 070", '\ 000'
0x00000038f30939ee в __strcpy_sse2_unaligned() из /lib64/libc.so.6
#include <stdlib.h>
#include <string.h>
#include <stdio.h>
int main()
{
char tmp[256];
sprintf(tmp, "%s", "99|71663138|316DEA40C62D6BA40B3C0AA2FE06C457|1442319758");
analyzeRecordForPGDBOperation(tmp);
return 0;
}
void analyzeRecordForPGDBOperation(char *data)
{
char tempBuff[256] = {'\0',};
char park[16] = {'\0',};
char codesite[16] = {'\0',};
char key[24] = {'\0',};
char timestamp[16] = {'\0',};
int caseVal = 0;
sprintf(tempBuff, "%s", data);
char *p = strtok(tempBuff,"|");
for (; p != NULL; p = strtok(NULL, "|"))
{
caseVal++;
switch(caseVal)
{
case 1:
sprintf(park, "%s", p);
break;
case 2:
sprintf(codesite, "%s", p);
//Value of codesite is printed correctly here
printf("\nCodesite: %s\n", codesite);
break;
case 3:
sprintf(key, "%s", p);
//Value of codesite is corrupted
printf("\nCodesite Case 3: %s\n", codesite);
break;
case 4:
sprintf(timestamp, "%s", p);
//Value of codesite is corrupted
printf("\nCodesite case 4: %s\n", codesite);
break;
default:
break;
}
}
}
Выход:
[корень ствол @ pe1800xs64] # ./a.out
analyzeRecordForPGDBOperation
сайте Google Code: 71663138
CodeSite Случай 3:
CodeSite случай 4:
Вы читаете 32-буквенный ключ в 24-байтовый буфер. Уч. –
попробуйте увеличить длину буферов назначения. –
Никогда не используйте 'sprintf', но всегда используйте [snprintf] (http://man7.org/linux/man-pages/man3/snprintf.3.html), например. 'snprintf (временная метка, sizeof (временная метка),"% s ", p);'; рассмотрите также [asprintf] (http://man7.org/linux/man-pages/man3/asprintf.3.html) –