Проблема в том, что строки в C завершаются нулем. Однако ваш массив достаточно велик только для одного символа, поэтому он не может заканчиваться нулем (для этого требуется как минимум 2 символа)
Почему вы получаете мусор? Когда вы говорите tabl[0].symbol[0] = 'A';
, в tabl[0].symbol[0]
в памяти у вас есть A???
, и мы не знаем, что такое ???
. Очевидно, что иногда это 0 (где вы получаете правильный вывод), иногда это не так (мусор).
Чтобы исправить это, используйте спецификатор формата %c
для печати одного символа вместо строки с нулевым символом в конце. Если вы действительно хотите печатать строки, вам нужно увеличить размер вашего строкового буфера и завершить его нулем:
SYMBSIZE = 10
, затем укажите tabl[0].symbol[1] = '\0';
Обратите внимание, вы обычно хотите использовать строковые функции:
// copy "a" to that memory location, will be null-terminated.
strcpy(tabl[0].symbol, "a");
Если ваш буфер недостаточно велик для строки, он переполнит буфер.