Como os literais de string são compilados em

Como os literais de string são compilados em C? De acordo com meu entendimento, no teste1, a string "olá" é inserida no segmento de dados pelo compilador e na segunda linha p é atribuído esse endereço virtual codificado. Isso está correto? e que não há diferença básica entre como o teste1 funciona e como o teste2 funciona.

Alguns códigos:

#include <stdio.h>

test1();
test2();
test3();

main()
{
    test1();
    test2();
    //test3();
}

test1()
{
    char *p;
    p="hello";
}

test2()
{
    char *p="hello";
}

test3()
{
    char *p;
    strcpy(p,"hello");
}

Qualquer referência do padrão C será muito apreciada, para que eu possa entender isso profundamente do ponto de vista do compilado

questionAnswers(2)

yourAnswerToTheQuestion