Отображение дополнительных данных в значениях массива

Я использую эту часть кода 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); и вы получили полную длину строки до нулевого символа.

Я думаю, что этого достаточно для объяснения.

Другие вопросы по тегам