Отображение дополнительных данных в значениях массива
Я использую эту часть кода C в карбида C / C++
char c1[]={0x01};
char c2[]={0x02};
char* c [] = {c1,c2};
когда я проверяю значения c[0],c[1].. я вижу два таких значения в режиме отладки
c[0] = \x01\x01 & (x) = *[0] = \x01
c[1] = \x02\x01\x01 & (x) = *[1] = \x02
и если я рассчитать длину, как это
int cclen2 = strlen(c[0]);
получение cclen2 = 2; но я должен получить значения как 1.
2 ответа
c1
а также c2
не имеют нулевых терминаторов, и strlen()
требует нулевого терминатора (наряду со многими другими функциями обработки C-строк, такими как printf("%s", c1)
например). Терминатор NULL добавляется неявно, только когда строковый литерал используется для инициализации char[]
,
Поменяйте на:
char c1[] = { 0x01, 0x00 };
char c2[] = { 0x02, 0x00 };
или же:
char c1[] = "\x01";
char c2[] = "\x02";
Массив создает специальный тип константного указателя. если вы объявляете это как char, то наконец добавляется нулевой символ. фактически ваш оператор c[0] заменяется на *(c+0); и получить адрес c.
strlen (c[0]) заменяется на strlen(c); и вы получили полную длину строки до нулевого символа.
Я думаю, что этого достаточно для объяснения.