Variables globales statiques vs variables globales C

J’ai le programme ci-dessous. Si je déclare des variables a, b, c, des variables globales statiques, cela donne une erreur de segmentation, mais si je les déclare non globales ou statiques, il ne donnera pas d’erreur de segmentation. Pourquoi se comporte-t-il de cette manière? Je sais qu’il y a plus de données que les variables ne peuvent en stocker, mais pourquoi donne-t-il une erreur de segmentation uniquement lorsqu’elle est déclarée statique? Les variables déclarées statiquement sont-elles stockées dans une partie différente du cadre de stack où le remplacement n’est pas autorisé?

EDIT: Je sais que strcpy n’est pas sans danger. Mais ce n’est pas mon problème. Je veux comprendre pourquoi un débordement donne segfault, pourquoi l’autre débordement peut ne pas donner segfault.

#include #include static char a[16]; static char b[16]; static char c[32]; int main(int argc, char *argv[]){ // char a[16]; //char b[16]; //char c[32]; strcpy(a,"0123456789abcdef"); strcpy(b,"0123456789abcdef"); strcpy(c,a); strcpy(c,b); printf("a = %s\n",a); return 0; } 

    L’alignement de la mémoire est important dans la variable de stack. Essayez-le avec l’option de protection de stack -fstack-protector-strong ou similaire, vous verrez le crash. Aussi, déclarez un int après c et débordez votre tableau c, vous pouvez voir le crash. vous devez vous assurer qu’il n’y a pas de rembourrage. Puisque b est un tableau, tout ce que vous dépassez de ‘a’ va à b. Essayez quelque chose comme:

     struct foo { char c[10]; int x; } __atsortingbute__((packed)); 

    vous verrez le crash quand vous débordez c.

    Vous rencontrez un comportement indéfini lorsque vous débordez.

    Attention, les chaînes const char * en C sont toujours terminées par 0, ce qui signifie que la chaîne “0123456789abcdef” contient en fait 17 caractères: "0123456789abcdef\0"

    Je vous suggère de toujours utiliser la version sécurisée

     strncpy() 

    Vous pouvez également consulter la documentation qui vous indique explicitement que le caractère null est inclus.

    http://www.cplusplus.com/reference/cssortingng/strcpy/