В этом случае строка "hello"
сохраняется в глобальной памяти *. Так что уже выделено.
Следовательно, он по-прежнему действителен, когда вы возвращаетесь из функции.
Однако, если вы сделали это:
char test[] = "hello";
return test;
Тогда нет, это не сработало бы. (неопределенное поведение) В этом случае строка на самом деле является локальным массивом, который больше не работает, когда функция возвращает.
* Хотя обычно это так, в стандарте не говорится, что он должен храниться в глобальной памяти.
Но важной частью является то, что время жизни строкового литерала - это длительность Вся программа. (см. комментарии)