Limite de taille de tas en C

J’ai un doute concernant le tas dans le diagramme de disposition d’exécution de programme d’un programme C.

Je sais que toute la mémoire allouée dynamicment est allouée en tas qui grandit dynamicment. Mais j’aimerais savoir quelle est la taille maximale du tas pour un programme C ??

Je viens de joindre un exemple de programme C … je suis en train d’essayer d’allouer 1 Go de mémoire à ssortingng et même de faire le memset …

#include  #include  #include  int main(int argc, char *argv[]) { char *temp; mybuffer=malloc(1024*1024*1024*1); temp = memset(mybuffer,0,(1024*1024*1024*1)); if( (mybuffer == temp) && (mybuffer != NULL)) printf("%x - %x\n", mybuffer, &mybuffer[((1024*1024*1024*1)-1)]]); else printf("Wrong\n"); sleep(20); free(mybuffer); return 0; } 

Si je lance le programme ci-dessus dans 3 instances à la fois, alors malloc devrait échouer au moins dans un cas [je le pense] … mais néanmoins, malloc a du succès.

Si cela réussit, puis-je savoir comment le système d’exploitation gère 3 Go de mémoire allouée dynamicment.

Il est très probable que votre ordinateur dépasse la RAM et ne l’utilise pas tant que vous ne l’écrivez pas. Essayez d’écrire dans chaque bloc après l’allocation, obligeant ainsi le système d’exploitation à s’assurer que la mémoire RAM réelle est mappée à l’adresse renvoyée par malloc() .

Depuis la page linux malloc,

 BUGS By default, Linux follows an optimistic memory allocation strategy. This means that when malloc() returns non-NULL there is no guarantee that the memory really is available. This is a really bad bug. In case it turns out that the system is out of memory, one or more pro‐ cesses will be killed by the infamous OOM killer. In case Linux is employed under circumstances where it would be less desirable to sud‐ denly lose some randomly picked processes, and moreover the kernel ver‐ sion is sufficiently recent, one can switch off this overcommitting behavior using a command like: # echo 2 > /proc/sys/vm/overcommit_memory See also the kernel Documentation directory, files vm/overcommit- accounting and sysctl/vm.txt. 

Malloc allouera la mémoire mais n’écrira rien. Donc, si la mémoire virtuelle est disponible, elle réussira. Ce n’est que lorsque vous écrivez quelque chose dans ce fichier que la vraie mémoire doit être paginée dans le fichier d’échange.

Calloc si la mémoire est correctement (!), Écrivez des zéros dans chaque octet de la mémoire allouée avant de renvoyer, il faudra donc allouer les pages ici et là.