Чтобы уточнить, этот код неверен по причинам, указанным в ОП:
char* a;
strcpy(a, "test");
Как отмечено в других ответах, синтаксис "char a [] =" test "" фактически не делает этого,Фактический эффект больше похож на этот:
char a[5];
strcpy(a, "test");
Первый оператор выделяет статический массив статических символов фиксированного размера в локальном стеке, а второй инициализирует данные в нем.Размер определяется по длине строкового литерала.Как и все переменные стека, массив автоматически освобождается при выходе из области действия функции.