URL: https://linuxfr.org/forums/programmation-c--2/posts/perdu-dans-la-m%C3%A9moire-malloc-stack-heap-et-syst%C3%A8me Title: Perdu dans la mémoire (malloc, stack, heap et système) Authors: bob_razowski Date: 2005年08月30日T16:32:37+02:00 Tags: Score: 0 Bonjour, Tout d'accord toutes mes excuses pour la longueur du post, mais j'ai ce problème depuis un bon bout de temps sans en voir la solution. j'ai un problème lié à de l'allocation mémoire par un malloc, mais aussi lié au système et à mes distribs par les limitations soft (ulimit). Je m'explique : j'ai 3 distribs 1. Redhat 8.0, noyau 2.4.18-14, glibc-2.2.93-5, aucune limite soft 1. Mandrake 10.1, noyau 2.6.8.1-12, glibc-2.3.3-21, limité en stack size à 8 Mo 1. Red Hat Enterprise 3, noyau 2.4.21-27.0.2, glibc-2.3.2-95.33, limité en stack size à 10 Mo. J'ai le code C suivant (pas parfait): #include stdlib.h #include malloc.h #include stdio.h int main(void) { £spaces£ £/spaces£unsigned int base,*decalage,longueur; £spaces£ £/spaces£unsigned int* addr; int i; £spaces£ £/spaces£base = 134835592; £spaces£ £/spaces£longueur = 40000; £spaces£ £/spaces£ £spaces£ £/spaces£addr = malloc(longueur * sizeof(base)); £spaces£ £/spaces£decalage=(addr-base) ; £spaces£ £/spaces£printf("\ndecalage = %u = %d et base = %u \n",decalage,decalage,base); £spaces£ £/spaces£printf("decalage = 0x%x et base = 0x%x \n",decalage,base); £spaces£ £/spaces£printf("addr = %u = %d\n",addr,addr); £spaces£ £/spaces£printf("addr = 0x%x\n",addr); £spaces£ £/spaces£printf("&addr = %u = %d\n",&addr,&addr); £spaces£ £/spaces£printf("&addr = 0x%x\n",&addr); £spaces£ £/spaces£for (i=0;i<longueur;i+=1024) {addr[i]=i;} } En exécutant ce code sur les 3 distribs, j'ai 2 types de résultats différents. les distribs 1 et 2 d'un coté, la 3 de l'autre. * distrib 1 : decalage = 534485480 = 534485480 et base = 134835592 decalage = 0x1fdb99e8 et base = 0x8096d88 addr = 1073827848 = 1073827848 addr = 0x40015008 &addr = 3221222084 = -ひく1073745212 &addr = 0xbffff2c4 * distrib 2 : decalage = 535673320 = 535673320 et base = 134835592 decalage = 0x1fedb9e8 et base = 0x8096d88 addr = 1075015688 = 1075015688 addr = 0x40137008 &addr = 3221221700 = -ひく1073745596 &addr = 0xbffff144 * distrib 3 : decalage = 2535635432 = -ひく1759331864 et base = 134835592 decalage = 0x9722b9e8 et base = 0x8096d88 addr = 3074977800 = -ひく1219989496 addr = 0xb7487008 &addr = 3221214884 = -ひく1073752412 &addr = 0xbfffd6a4 Sauf que quand je supprime la limitation sur la stacksize de la distrib 3, je me retrouve avec les mêmes types de résultats pour toutes les distribs (je rappelle que la distrib 2 a elle aussi une limite sur la stacksize sans donner de résultats différents de la distrib 1.) * distrib 3 : decalage = 535775720 = 535775720 et base = 134835592 decalage = 0x1fef49e8 et base = 0x8096d88 addr = 1075118088 = 1075118088 addr = 0x40150008 &addr = 3221222068 = -ひく1073745228 &addr = 0xbffff2b4 Par même type de résultats, je veux dire que l'allocation malloc se fait dans les environs de la même adresse. Ceci est important, car les adresses représentées non signées sont négatives, ce qui peut entraîner des débordements lorsqu'elles sont utilisées en valeur absolue (c'est pas moi qui programme !)dans une autre partie de code. Détail amusant : lancé plusieurs fois, le code donne exactement les mêmes résultats pour les distribs 1 et 2 ; pour la distrib 3 (limitée ou pas) les résultats diffèrent à chaque exécution. Bref, mes questions sont les suivantes : * quelle est le lien entre la stacksize et le malloc ? * pourquoi la limitation stacksize n'a pas d'influence sur la distrib 2 alors qu'elle en a sur la distrib 3 ? Par avance, merci à tous ceux qui auront pris le temps de me lire, et surtout de me répondre. PS : si quelqu'un pouvait m'expliquer comment on fait "<" et ">" ça m'arrangerait, j'y suis pas arrivé. Merci.

AltStyle によって変換されたページ (->オリジナル) /