Pourquoi char [] est-il sur la pile, mais char * sur le tas?

Je suis très confus au sujet de ce qui se passe. J'ai toujours pensé que char * et char [] étaient interchangeables, mais après avoir regardé les adresses de mémoire il me semble char * alloue de l'espace dans le tas, alors que char [] est d'allouer de la mémoire sur la pile.

char stack[] = "hello";
char *heap = "hello";

char *heap_string_malloc = malloc(5);
heap_string_malloc = "hello";

printf("Address of stack[0]: %p\n", stack);
printf("Address of heap[0]: %p\n", heap);
printf("Address of heap_string_malloc[0]: %p\n", heap_string_malloc);

Résultats suivants:

Address of stack[0]: 0x7fff8b0b85b0
Address of heap[0]: 0x400760
Address of heap_string_malloc[0]: 0x400760

Est-ce à dire que char * est allouée dynamiquement?

Suite à ma confusion, comment se fait - malloc est d'allouer la même adresse mémoire que ce char *heap a déjà alloué? Je ne suis pas en cours d'exécution toute optimisation (simplement gcc file.c).

source d'informationauteur tgun926