IdentifiantMot de passe
Loading...
Mot de passe oubli� ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les r�ponses en temps r�el, voter pour les messages, poser vos propres questions et recevoir la newsletter

Biblioth�que standard C Discussion :

Taille d'allocation de Malloc


Sujet :

Biblioth�que standard C

  1. #1
    Membre averti
    Inscrit en
    Janvier 2004
    Messages
    18
    D�tails du profil
    Informations forums :
    Inscription : Janvier 2004
    Messages : 18
    Par d�faut Taille d'allocation de Malloc
    Je cherche a comprendre pourquoi cet utilisation de malloc fonctionne, mais ne devrait pourtant pas fonctionner?


    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
     
     
    typedef struct
    {
    	unsigned int entry_start;
    	unsigned int entry_end;
    }ENTRY;
     
     
    int main(int argc, char *argv[])
    {
        ENTRY *file_entry;
        int i;
     
     
        file_entry  = malloc(0);
       for (i=0;i<35;i++)
        {
           file_entry[i].entry_start = i;
           file_entry[i].entry_end = i+1;       
        }  
     
        for (i=0;i<35;i++)
        {
            printf("entry start : %d entry end : %d\n", file_entry[i].entry_start, file_entry[i].entry_end );  
        }    
     
        system("PAUSE");   	
        return 0;
    }
    Si j'arr�te la boucle a 36 ou +, l� par contre sa ne fonctionne plus, des explication?

  2. #2
    Membre Expert
    Profil pro
    Inscrit en
    Ao�t 2006
    Messages
    1 104
    D�tails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Ao�t 2006
    Messages : 1 104
    Par d�faut
    Salut.

    Le comportement est d�fini par l'impl�mentation.

    La norme C90 n'est pas tr�s loquace � ce sujet :
    If the size of the space requested is zero, the behavior is implementation defined; the value returned shall be either a null pointer or a unique pointer.
    La norme ne d�finit pas ce qu'est ce fameux "unique pointer"... ou alors peut-�tre de mani�re d�tourn�e (?). Les connaisseurs donneront s�rement des pr�cisions.

    Par contre C99 pr�cise mieux les choses :
    If the size of the space requested is zero, the behavior is implementation-defined: either a null pointer is returned, or the behavior is as if the size were some nonzero value, except that the returned pointer shall not be used to access an object.
    Cela veut dire que si la fonction renvoie autre chose que NULL ce pointeur ne devra pas �tre utilis� pour acc�der � l'objet. Mais le "the behavior is as if the size were some nonzero value" laisse supposer qu'il s'agit d'un pointeur valide, dans le sens o� on peut ensuite l'utiliser avec free.

    Mais dans la pratique je ne vois de toute fa�on pas l'int�r�t d'allouer 0 byte de m�moire.
    J'ai une question � mon tour : pourquoi la norme permet-elle ce cas sp�cial ? Pour laisser un peu de souplesse � l'impl�mentation ?

  3. #3
    Mod�rateur
    Avatar de Obsidian
    Homme Profil pro
    Chercheur d'emploi
    Inscrit en
    Septembre 2007
    Messages
    7 495
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    �ge : 49
    Localisation : France, Essonne (�le de France)

    Informations professionnelles :
    Activit� : Chercheur d'emploi
    Secteur : High Tech - �diteur de logiciels

    Informations forums :
    Inscription : Septembre 2007
    Messages : 7 495
    Par d�faut
    Bonjour,

    Citation Envoy� par jeroman Voir le message
    J'ai une question � mon tour : pourquoi la norme permet-elle ce cas sp�cial ? Pour laisser un peu de souplesse � l'impl�mentation ?
    J'imagine que c'est utile lorsque la quantit� de m�moire � r�server est d�termin� par calcul � l'ex�cution (du style � malloc(nombredelements * sizeof element) �). Dans le cas d'une liste vide, il est idiot d'allouer de la m�moire pour rien, mais il faut quand m�me que le pointeur soit valide pour ne pas mettre en �chec le programme qui fait cet appel.

    Dans ce cas, soit on renvoie effectivement NULL, soit on r�serve � l'avance un octet � permanent � � l'aide d'une variable globale ou une locale statique, qui serve de � parking � et dont on renverrait l'adresse � toujours la m�me � � tous les malloc(0). Je pense que c'est ce qu'ils entendent par � pointeur unique �.

  4. #4
    Membre averti
    Inscrit en
    Janvier 2004
    Messages
    18
    D�tails du profil
    Informations forums :
    Inscription : Janvier 2004
    Messages : 18
    Par d�faut
    En fait, au d�but je me demandais si j'allouais vraiment le bon espace, je me suis mis a faire des test, et peu importe la valeurs que je lui met, sa semble �tre faux, m�me si je met malloc(1)... je peut utiliser 35 �l�ments, pourtant au deuxi�me, sa devrait ne pas fonctionner...

  5. #5
    gl
    gl est d�connect�
    R�dacteur

    Homme Profil pro
    Inscrit en
    Juin 2002
    Messages
    2 165
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    �ge : 46
    Localisation : France, Is�re (Rh�ne Alpes)

    Informations forums :
    Inscription : Juin 2002
    Messages : 2 165
    Par d�faut
    Citation Envoy� par eric30eric Voir le message
    En fait, au d�but je me demandais si j'allouais vraiment le bon espace, je me suis mis a faire des test, et peu importe la valeurs que je lui met, sa semble �tre faux, m�me si je met malloc(1)... je peut utiliser 35 �l�ments, pourtant au deuxi�me, sa devrait ne pas fonctionner...
    C'est un comportement ind�fini, tout peut arriver y compris un code qui semble marcher (jusqu'au jour o�).

  6. #6
    Expert confirm�

    Inscrit en
    Novembre 2005
    Messages
    5 145
    D�tails du profil
    Informations forums :
    Inscription : Novembre 2005
    Messages : 5 145
    Par d�faut
    Citation Envoy� par Obsidian Voir le message
    Dans ce cas, soit on renvoie effectivement NULL, soit on r�serve � l'avance un octet � permanent � � l'aide d'une variable globale ou une locale statique, qui serve de � parking � et dont on renverrait l'adresse � toujours la m�me � � tous les malloc(0). Je pense que c'est ce qu'ils entendent par � pointeur unique �.
    pointeur unique c'est que chaque malloc(0) en renvoie un diff�rent (jusqu'� ce qu'il soit lib�r�). Voir la citation de Jeroman.

    Citation Envoy� par eric30eric Voir le message
    En fait, au d�but je me demandais si j'allouais vraiment le bon espace, je me suis mis a faire des test, et peu importe la valeurs que je lui met, sa semble �tre faux, m�me si je met malloc(1)... je peut utiliser 35 �l�ments, pourtant au deuxi�me, sa devrait ne pas fonctionner...
    Formellement, tu fais quelque chose que tu ne dois pas, n'importe quoi peut arriver, y compris fonctionner comme tu penses que �a devrait.

    En pratique, tu as vraisemblablement foutu en l'air les structures de donn�es utilis�es par malloc, mais �a se verra plus tard quand tu auras fais d'autres allocations/d�allocations.

  7. #7
    Mod�rateur
    Avatar de Obsidian
    Homme Profil pro
    Chercheur d'emploi
    Inscrit en
    Septembre 2007
    Messages
    7 495
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    �ge : 49
    Localisation : France, Essonne (�le de France)

    Informations professionnelles :
    Activit� : Chercheur d'emploi
    Secteur : High Tech - �diteur de logiciels

    Informations forums :
    Inscription : Septembre 2007
    Messages : 7 495
    Par d�faut
    Citation Envoy� par eric30eric Voir le message
    m�me si je met malloc(1)... je peut utiliser 35 �l�ments, pourtant au deuxi�me, sa devrait ne pas fonctionner...
    Un d�but d'explication ici : http://www.developpez.net/forums/d88...e/#post5018145

    Citation Envoy� par Jean-Marc.Bourguet Voir le message
    pointeur unique c'est que chaque malloc(0) en renvoie un diff�rent (jusqu'� ce qu'il soit lib�r�). Voir la citation de Jeroman.
    Mouais. �a ne me convainc pas. Je reste � peu pr�s persuad� que l'auteur du paragraphe de la premi�re norme le voyait � peu pr�s comme je le vois, avant que ce point ambigu ne soit clarifi� dans C99 et qu'il y soit d�cid� de faire en sorte que les pointeurs renvoy�s, si non NULL, se comportent de la m�me fa�on dans tous les cas�

  8. #8
    Expert confirm�

    Inscrit en
    Novembre 2005
    Messages
    5 145
    D�tails du profil
    Informations forums :
    Inscription : Novembre 2005
    Messages : 5 145
    Par d�faut
    Citation Envoy� par Obsidian Voir le message
    Mouais. �a ne me convainc pas. Je reste � peu pr�s persuad� que l'auteur du paragraphe de la premi�re norme le voyait � peu pr�s comme je le vois, avant que ce point ambigu ne soit clarifi� dans C99 et qu'il y soit d�cid� de faire en sorte que les pointeurs renvoy�s, si non NULL, se comportent de la m�me fa�on dans tous les cas�
    Voir le rationale, la r�daction est un compromis entre les tenants du "il n'y a pas d'objets de taille nulle, donc un malloc() de taille 0 est une erreur", et "il y a des objets de taille nulle, donc un malloc() de taille 0 renvoie un pointeur diff�rent de tous les autres pointeurs valides".

    Pour corroborer: l'impl�mentation de malloc() de Plauger dans The Standard C Library (1991) commence par
    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
    3
     
    if (size <  SIZE_CELL)
       size = SIZE_CELL;
    et il �tait le pr�sident de sous-comit� "librairie" avant de prendre celle du comit� au complet.

  9. #9
    Invit�
    Invit�(e)
    Par d�faut
    Bonjour,
    Il me semble que malloc, en plus de r�server de la m�moire, cr�e une ent�te. Donc, �a ne me parait pas contradictoire de pr�voir dans la norme d'ex�cuter malloc, m�me si l'espace n�cessaire � r�server est nul.
    Par contre, � moins de tester explicitement les fonctions de base, malloc en l'occurrence, cette instruction malloc(0) n'a pas de sens. Pourquoi un d�veloppeur voudrait-il r�server explicitement un bloc m�moire de taille z�ro? En plus de la syntaxe, la programmation sous-entend une certaine logique.
    C'est d'autant plus �tonnant que dans la suite du code il utilise cette m�moire, comme s'il l'avait r�ellement r�serv�e.
    Il y a une certaine probabilit� que une certaine quantit� d'octets qui suivent l'adresse du pointeurs ne soient pas utilis�s ACTUELLEMENT. Mais on ne peut pas dire, et en aucun cas, que ca marche.
    Vous garez votre voiture sur un espace pompier, tant qu'il n'y aura ni incendie ni police, pouvez-vous dire "On peut se garer sur un espace pompier"?

  10. #10
    Mod�rateur
    Avatar de Obsidian
    Homme Profil pro
    Chercheur d'emploi
    Inscrit en
    Septembre 2007
    Messages
    7 495
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    �ge : 49
    Localisation : France, Essonne (�le de France)

    Informations professionnelles :
    Activit� : Chercheur d'emploi
    Secteur : High Tech - �diteur de logiciels

    Informations forums :
    Inscription : Septembre 2007
    Messages : 7 495
    Par d�faut
    Citation Envoy� par Pierre Dolez Voir le message
    Il me semble que malloc, en plus de r�server de la m�moire, cr�e une ent�te. Donc, �a ne me parait pas contradictoire de pr�voir dans la norme d'ex�cuter malloc, m�me si l'espace n�cessaire � r�server est nul.
    �a, c'est une question d'impl�mentation. Ce n'est pas sp�cifi� par la norme. De plus, rien n'impose aux m�ta-donn�es d'�tre contigu�s � l'espace r�serv�. Je sais que �a se faisait sous DOS, oui, mais ailleurs, il est plus cens�, � mon go�t, de maintenir une map � un seul endroit gardant trace de tous les pointeurs renvoy�s et des plages correspondantes.

    Par contre, � moins de tester explicitement les fonctions de base, malloc en l'occurrence, cette instruction malloc(0) n'a pas de sens. Pourquoi un d�veloppeur voudrait-il r�server explicitement un bloc m�moire de taille z�ro? En plus de la syntaxe, la programmation sous-entend une certaine logique.
    On a d�j� donn� un exemple plus haut. Il faut relire le fil en entier avant de poster.

Discussions similaires

  1. R�ponses: 10
    Dernier message: 24/06/2014, 16h57
  2. Probl�me de choix d'allocation new/malloc
    Par Awakening dans le forum Langage
    R�ponses: 3
    Dernier message: 25/02/2011, 09h32
  3. [x86-64] Allocation dynamique (malloc) et heap
    Par xion.luhnis dans le forum x86 32-bits / 64-bits
    R�ponses: 5
    Dernier message: 23/10/2010, 19h23
  4. Probl�me allocation m�moire - malloc () 1Gb
    Par Gellius31 dans le forum Biblioth�que standard
    R�ponses: 14
    Dernier message: 21/12/2007, 12h16
  5. Pb d'allocation m�moire malloc
    Par oz80 dans le forum C++
    R�ponses: 5
    Dernier message: 18/11/2005, 17h23

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo