Как отмечается в замечании, ваши массивы не заканчиваются нулевым символом, поэтому printf продолжается после них.
Вы получаете этот результат, потому что компилятор помещает ваши массивы в память один за другим, и, наконец, по другой причине появляется нулевой символ
Таким образом, минимальные изменения
unsigned char mydata1[] = {0x41,0x42,0x43, 0};
unsigned char mydata2[] = {0x44,0x45,0x46, 0};
unsigned char mydata3[] = {0x47,0x48,0x49,0x4A, 0}
но этот способ предполагает, что ваш компилятор использует код ASCII, и это не читается, лучше сделать
unsigned char mydata1[] = {'A', 'B', 'C', 0};
unsigned char mydata2[] = {'D', 'E', 'F', 0};
unsigned char mydata3[] = {'G','H','I','J', 0};
или более простой:
unsigned char mydata1[] = "ABC";
unsigned char mydata2[] = "DEF";
unsigned char mydata3[] = "GHIJ";
Из этого
- делать
for(i = 0; i < 3; i++)
- это опасно , потому что если вы измените количество элементов на charPtr , вам также потребуется изменить для , один из способов - добавить указатель NULL, чтобы отметить конец списка указателей и выполнить итерацию до указателя NULL, а другой - выполнить итерацию, пока i < (sizeof(charPtr)/sizeof(charPtr[0]))
.
- лучше не использовать int для ввода i , но
size_t
, потому что это естественный тип для индекса