Probleme allocation memoire

Bonsoir,
J’ai essayé d’allouer un tableau statique de plus de 2 millions d’entiers dans un programme C (j’ai une ram de 2 gigas) et à l’exécution j’ai une erreur de segmentation. alors qu’en allouant un tableau avec moins de 2 millions d’entiers il n’y a pas de problème.
Ce qui m’intrigue c’est qu’un tableau de 2 millions d’entiers n’occupe que 8 mégas et que la commande free m’indique que j’ai plusieurs centaines de mégas de libres.
Y a-t-il moyen de modifier cette limite en paramétrant je ne sais quelle variable d’environnement ou est-ce purement un problème de programmation ?

Merci pour votre aide

short ou long ?
Sur OS 32 ou 64 ?
Ca ne serait pas tout bêtement une question de limite d’adressage ?

Si je ne me trompe pas, la pile et bien plus petite que le tas. Par contre je ne sais pas comment et si on peut modifier sa taille.

programme compilé avec gcc 4.4.5 sur debian squeeze (sur PC 32 bits)

#include <stdio.h>
int main()
{
    int t [2500000] ;
    t[0] = 1 ;
}

C’est l’instruction t[0]=1 qui est la cause de l’erreur de segmentation

2^32 = 4294967296
-> sur 32 bits, ça fait 4Go d’espace adressable, au delà on atteint des limites.
C’est peut être aussi un problème à cause de la nécessité d’allouer de manière contigüe la mémoire pour un tableau statique qui rentre dans les limites de ta ram physique, auquel cas tu peux peut être t’en sortir avec un tableau dynamique et un malloc, mais de toutes les manières, il n’y a plus aucune raison de rester en 32bits, et si ton PC a moins de 4/5 ans, sois sérieux, et passes en 64 bits.
Ou alors tu passes en short (1 octet par valeur entière, bref des char), et là, ton tableau ne prendra que 2Go.

Par pure curiosité, si tu passes en dynamique avec malloc, il se passe quoi ?

je ne comprends pas ton raisonnement mattotop, mon tableau n’occupe que 10M de ram (2500000 fois 4 octets par entier), on est très très loin des 4G d’espace adressable…

En effet avec un malloc, ça change tout. J’ai pu allouer un tableau 500 millions d’entiers.
La différence est énorme (200 fois plus), c’est vraiment étonnant…
Merci pour votre aide.

Comme déjà dis c’est un problème lié à la taille de la pile. Je ne sais pas quel est la taille de la pile mais tu semble déborder. Plus d’informations ici : fr.wikipedia.org/wiki/D%C3%A9passement_de_pilev

Le tas, lui est bien plus grand ça ne lui pose pas de problème d’avoir de très grosses variables.

Le problème de contiguïté de la mémoire devrait être transparent avec la pagination, c’est généralement plus un problème de performance que de correction d’un programme.

J’ai pu déterminer la limite avec la fonction getrlimit, et le paramètre RLIMIT_STACK
j’obtiens la valeur 8388608 , je suppose que ce nombre indique la taille en octets de la pile.
J’ai changé cette valeur avec setrlimit mais rien y fait j’ai quand même mon erreur de segmentation.
Bon, ce n’est pas grave j’utiliserai des malloc.