C: Segfaults d’initialisation de tableau selon la taille et appel à printf ()

Un autre étudiant m’a demandé ce qui pouvait être faux avec son code C. J’ai reproduit avec succès le comportement erroné et je n’ai absolument aucune idée de la raison de cette erreur de segmentation. Considérez ce petit programme C:

#include  int main(void) { int N = 590; double A[N][N]; double B[N][N]; double C[N][N]; printf("done"); } 
  • Définissez N à une valeur <= 590:
    Cela fonctionne sans erreur, avec ou sans sortie.
  • mettre N à une valeur> 590:
    • Fonctionne parfaitement avec la ligne de sortie supprimée.
    • Comstackr et exécuter avec la sortie: erreur de segmentation

Quelle en est la raison? Quelqu’un peut-il expliquer?

Vous essayez d’allouer plus de mémoire que disponible sur la stack, ce qui provoque un dépassement de capacité de la stack . Il est généralement préférable d’allouer de tels tableaux de manière dynamic en utilisant malloc , calloc ou realloc . N’oubliez pas de libérer cette mémoire en appelant free quand vous avez fini 🙂

Ces questions vous aideront aussi:
C / C ++ taille de stack maximale du programme
Erreur de segmentation lors de la création d’un tableau en C
Erreur de segmentation lors de l’utilisation d’une variable pour lancer un tableau

La quantité de stack disponible pour votre application dépend fortement du système et les variables automatiques (telles que vos tableaux doubles) consumnt de l’espace de stack. L’appel d’une fonction nécessite un espace de stack supplémentaire (pour ses variables, ainsi que des tâches telles que des registres sauvegardés et un sharepoint retour). Vous allez au bout de votre stack et essayez d’accéder à la mémoire à laquelle il vous est interdit d’accéder.

Vous obtenez un débordement de stack. Cependant, je peux le reproduire ici avec et sans le printf avec VC ++. Ma meilleure hypothèse est que l’opération consistant à envoyer des arguments au printf sur la stack provoque la manifestation de l’erreur. Cela arrive-t-il quand même si vous appelez une fonction qui ne prend aucun paramètre?