Your original code is returning a copy of the structure created in the function - because you're returning a structure type, not a pointer to a structure. What it looks like is that the entire structure is passed by value with rax. Generally speaking, the compiler can produce various assembly codes for this, depending and caller and callee behavior and calling convention.
The proper way to handle structure is to use them as out parameters:
void func(t_test* t)
{
t->i = 100;
t->c = 'a';
}