Erreur de segmentation due au manque de mémoire en C

Ce code me donne une erreur de segmentation environ la moitié du temps:

int main(int argc, char **argv) { float test[2619560]; int i; for(i = 0; i < 2619560; i++) test[i] = 1.0f; } 

Je dois en fait allouer un ensemble beaucoup plus grand, y a-t-il un moyen de permettre au système d’exploitation de me permettre d’avoir plus de mémoire?

J’utilise Linux Ubuntu 9.10

Vous débordez la taille de stack maximale par défaut, qui est de 8 Mo.

Vous pouvez soit augmenter la taille de la stack – par exemple. pour 32 MB:

 ulimit -s 32767 

… ou vous pouvez passer à l’allocation avec malloc :

 float *test = malloc(2619560 * sizeof test[0]); 

En ce moment, vous 2619560*sizeof(float) (ou du moins essayez) 2619560*sizeof(float) octets sur la stack. Au moins dans la plupart des cas, la stack ne peut utiliser qu’une quantité limitée de mémoire. Vous pourriez essayer de le définir static place:

 static float test[2619560]; 

Cela le sort de la stack, il peut donc généralement utiliser n’importe quelle mémoire disponible. Dans d’autres fonctions, définir quelque chose comme static change la sémantique, mais dans le cas de main cela ne fait guère de différence (autre que la possibilité essentiellement théorique d’une main récursive).

Ne placez pas un object aussi gros sur la stack. Au lieu de cela, envisagez de le stocker dans le tas, en allouant avec malloc () ou ses amis.

Les flotteurs 2.6M ne sont pas très nombreux, et même sur un système 32 bits, vous devriez être d’accord avec l’espace d’adressage.

Si vous avez besoin d’allouer un très grand tableau, veillez à utiliser un système 64 bits (en supposant que vous ayez suffisamment de mémoire!). Les systèmes 32 bits ne peuvent traiter que de la 3G par processus, et même dans ce cas, vous ne pouvez pas tout atsortingbuer comme un seul bloc contigieux.

C’est le débordement de stack. Vous feriez mieux d’utiliser la fonction malloc pour obtenir une mémoire supérieure à la taille de la stack que vous pouvez obtenir à partir de “ulimit -s”.