Это немного упрощение, но, надеюсь, оно проиллюстрирует, что происходит.
typedef struct _cust {
char customerId[10];
char customerPhone[10];
char customerDep[4];
} cust;
То, что с этим сделает компилятор, притворится, что это 24-символьный блоб.Предположим, что blob коренится в символе *, который называется x.Тогда customerId - это просто псевдоним для x + 0, customerPhone - это псевдоним для x + 10, а customerDep - псевдоним для x + 20.
Итак, что происходит, когда вы перезаписываете указатель со строкой, так этоx = testChar.
Это означает, что customerId - это & testChar [0], customerPhone - это & testChar [10] и т. д.
Проблема в том, что printf и друзья, как сказал QuantumMechanic, делаютне иметь понятия диапазона для строки.Строка AC только начинается до нулевого байта.Это означает, что printf () в customId будет идти от testChar [0] до тех пор, пока он не достигнет нулевого байта, который будет концом строки testchar.
Чтобы сделать то, что вы хотите, каждая строка должна иметьв конце вставлен нулевой байт, означающий, что ваше наложение не будет работать (также я считаю, что ваше наложение может привести к неопределенному поведению, но я не уверен).
(или вы можете сделать какпредложил мтекерт.)