Читать это: Конструкторы копирования по умолчанию и операторы присваивания
Не предоставляя оператор присваивания, структура _s_t будет делать мелкую копию всех своих членов при назначении. Поскольку вы храните все в _t_t по значению, все данные копируются по значению.
Проблема, которую вы описываете, заключается в том, что _t_t содержит указатель на данные.
в случае:
typedef struct _s_t{
int a;
int b;
t_t* t;
}s_t;
void test(s_t & s){
t_t x = {502, 100};
s.t = &x;
}
Это может вызвать проблему, поскольку t_t будет уничтожен в конце test (), и в этот момент этот указатель будет недействительным.
ETA: потому что вы добавили больше к вопросу ...
void test(s_t & s){
t_t x = {502, 100};
t_t * pt = &(s.t);
pt = &x;
}
Вы создали другую проблему здесь. То, что там произошло, вы создали указатель на адрес s.t, и это нормально. Однако затем вы переназначили этот указатель так, чтобы он указывал на x (это назначение ничего не сделало для s.t, вы просто меняете то, на что указывает указатель pt)
Причина, по которой вывод «как положено», заключается в том, что вы просто читаете неинициализированное состояние структуры.