Commande printf provoquant une erreur de segmentation?

Lorsque j’essaie d’initialiser un grand tableau de caractères à deux dimensions, cela fonctionne parfaitement. Mais lorsque j’ajoute une simple commande d’impression, cela me donne un problème de segmentation. Des idées pour expliquer pourquoi cela se produit?

#include int main(void) { printf("!"); char f[10000][10000]; } 

Cela fonctionne très bien sans la commande printf, ou même si la commande printf n’imprime rien (c’est-à-dire “”). Si je le fais imprimer quoi que ce soit, cela donne l’erreur.

De l’aide?

C’est probablement parce que vous dépassez la stack. Votre définition de f prend 100 Mo d’espace de stack (10000×10000 octets) et probablement dès que vous utiliserez réellement la stack, le système constatera qu’il n’ya pas beaucoup d’espace sur la stack et sur le segment. Vous trouverez probablement la même chose en appelant une autre fonction.

Les allocations de cette taille doivent être effectuées via malloc ().

  char *f= malloc(10000*10000); // access two dimensionally (equivalent of f[5][8]) char z= f[5*10000 + 8]; 

Vous dépassez une limite non spécifiée de votre implémentation C, en particulier la taille totale des objects à durée de stockage automatique (ou “variables locales”). La taille de f[] est de 100 000 000 octets. De nombreuses implémentations C conservent des variables automatiques sur la stack, qui est généralement une ressource limitée. Sur mon système Unix (FreeBSD), je peux inspecter cette limite:

 $ ulimit -a -t: cpu time (seconds) unlimited -f: file size (blocks) unlimited -d: data seg size (kbytes) 33554432 -s: stack size (kbytes) 524288 [...] 

et si les puissances supérieures le permettent, augmentez-le avec le ulimit -s number .