Как ограничить массивы символов для передачи в функцию

Есть константы:

const uint8_t background_part[5] = "\" & \"";
const uint8_t and_part[6] = "\" && \"";
const uint8_t output_to_start_part[5] = "\" > \"";
const uint8_t output_to_end_part[6] = "\" >> \"";
const uint8_t input_from_part[5] = "\" < \"";
const uint8_t bracket_left_part[5] = "\" ( \"";
const uint8_t bracket_right_part[5] = "\" ) \"";

Есть функция в другом модуле:

int32_t comp_last_copa_part (const copa *t, const uint8_t *buf, int32_t ssize_buf);

При передаче ей параметром buf консты background_part, например, в gdb отладчике происходит следующее:

comp_last_copa_part (t=0x55555555b2e0, buf=0x555555557093 <background_part> "\" & \"\" && \"\" > \"\" >> \"\" < \"\" ( \"\" ) \"Set termios new attributes", size_buf=5)

Вопрос: Почему передается такая строка? Что за buf=0x555555557093 <background_part> "" & "" && "" > "" >> "" < "" ( "" ) "Set termios new attributes"

"Set termios" это вообще строка из perror, вот фрагмент кода, он идет ниже объявлений констант:

} else {
        perror("Set termios new attributes");
        exit(1);
}

Я не знаю как четче назвать этот вопрос, если модераторы знают, то будьте добры поправить.

Я конечно вижу по коду, почему так получается, типа это начало всех ниже строк, но ведь это не правильно по-моему, как решаеются подобного рода проблемы?


Ответы (1 шт):

Автор решения: DmitryK

Как написал ori, размер ваших массивов не вмещает символ '\0' - конец строки. И в некоторых компиляторах выдается предупреждение - initializer-string for array of chars is too long "размер инициализирующей строки слишком велик". Просто сделайте все массивы на 1 больше, чем символов строках.

const uint8_t background_part[6] = "\" & \"";
→ Ссылка