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

C Discussion :

Le bloc renvoyé par la fonction malloc


Sujet :

C

  1. #1
    Candidat au Club
    Profil pro
    Inscrit en
    Octobre 2007
    Messages
    3
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2007
    Messages : 3
    Points : 2
    Points
    2
    Par défaut Le bloc renvoyé par la fonction malloc
    Je cherche désespérement la réponse à une question que je me pose : pour parler de la mémoire vive on parle du "segment-mémoire", mais est-ce vraiment un segment ou un cercle ?
    Je m'explique : est-il possible que si j'alloue 10 octets avec la fonction malloc, le bloc mémoire retourné aille par exemple de l'octets n°(SIZE_MAX-4) à l'octet n°5?

    Par exemple imaginons que je compile ce programme :

    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
     
    int my_str_len(char *str)
    {
    	//si str est nulle, renvoie -1
    	//si str est non-nulle, renvoie la taille de str
    }
     
    int main()
    {
    	char *str = malloc(4);
    	str[0] = 'a';
    	str[1] = 'b';
    	str[2] = 'c';
    	str[3] = '\0';
     
    	printf("%d\n",my_str_len(str)); //affiche 3 : normal
     
    	printf("%d\n",my_str_len(str+1)); //affiche 2 : normal
    }
    Je me demande s'il est possible que ce programme buggue, si par exemple l'appel de malloc(4) retourne un bloc de mémoire dont l'adresse est SIZE_MAX. Auquel cas, le 2ème appel de my_str_len retourne -1 au lieu de 2, car str+1 vaut NULL.

    Voilà, j'espère que je me suis fait comprendre, et que quelqu'un saura me répondre.

  2. #2
    Expert éminent sénior
    Avatar de Emmanuel Delahaye
    Profil pro
    Retraité
    Inscrit en
    Décembre 2003
    Messages
    14 512
    Détails du profil
    Informations personnelles :
    Âge : 68
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Points : 20 985
    Points
    20 985
    Par défaut
    Citation Envoyé par clement_ Voir le message
    Je cherche désespérement la réponse à une question que je me pose : pour parler de la mémoire vive on parle du "segment-mémoire",
    Pas vraiment, non. En tout cas, pas du point de vue du programmeur. On ne parle d'ailleurs pas de 'mémoire vive', (RAM) qui est un concept 'matériel', mais de mémoire, tout simplement. Ensuite, il y a 3 'classes' de mémoire en C.
    • La mémoire statique (ou persistante)
    • La mémoire automatique (variables locale, pile ...)
    • La mémoire allouée (malloc() etc.)

    Détails ici :

    http://emmanuel-delahaye.developpez....es.htm#donnees
    (ou de mémoure all mais est-ce vraiment un segment ou un cercle ?
    Je ne suis pas bien sûr de comprendre cette question... La mémoire c'est une suite d'éléments de bases identiques (bytes).
    Je m'explique : est-il possible que si j'alloue 10 octets avec la fonction malloc, le bloc mémoire retourné aille par exemple de l'octets n°(SIZE_MAX-4) à l'octet n°5?
    Ah, OK. Non. Le bloc alloué est contigu. C'est garanti par la norme. Sinon, malloc() retourne NULL (echec de l'allocation).

    Par exemple imaginons que je compile ce programme :

    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
     
    int my_str_len(char *str)
    {
    	//si str est nulle, renvoie -1
    	//si str est non-nulle, renvoie la taille de str
    }
     
    int main()
    {
    	char *str = malloc(4);
    	str[0] = 'a';
    	str[1] = 'b';
    	str[2] = 'c';
    	str[3] = '\0';
     
    	printf("%d\n",my_str_len(str)); //affiche 3 : normal
     
    	printf("%d\n",my_str_len(str+1)); //affiche 2 : normal
    }
    Je me demande s'il est possible que ce programme buggue, si par exemple l'appel de malloc(4) retourne un bloc de mémoire dont l'adresse est SIZE_MAX. Auquel cas, le 2ème appel de my_str_len retourne -1 au lieu de 2, car str+1 vaut NULL.

    Voilà, j'espère que je me suis fait comprendre, et que quelqu'un saura me répondre.
    (Rappel : [C99]SIZE_MAX désigne la plus grande valeur d'un size_t)

    Tu peux allouer plusieurs objets de taille SIZE_MAX. Tu peux même allouer un objet plus grand que SIZE_MAX avec calloc().

    Tu te poses des questions légitimes et c'est bien. Mais je te rassure, le comportement de malloc() est clair. Si la valeur retournée est <> NULL, le bloc est valide. Si c'est NULL, il n'y a pas eu de bloc alloué.

    Il y a cependant des précautions à prendre avec realloc().

  3. #3
    Candidat au Club
    Profil pro
    Inscrit en
    Octobre 2007
    Messages
    3
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2007
    Messages : 3
    Points : 2
    Points
    2
    Par défaut
    J'ai du mal formuler ma question, merci de t'être penché dessus.
    Je sais qu'un bloc alloué par malloc est contigu.
    Imaginons que SIZE_MAX = 100 (ce qui n'est pas vrai mais je prends la valeur 100 parce que c'est + pratique), est-il possible que le bloc renvoyé par malloc(5) soit constitué des octets n° 99, 100, 0, 1, 2 ? Ce bloc est contigu vu qu'en modulo (SIZE_MAX+1), 100+1 = 0.

    Voilà, j'espère avoir été plus clair.

  4. #4
    Expert éminent sénior
    Avatar de Emmanuel Delahaye
    Profil pro
    Retraité
    Inscrit en
    Décembre 2003
    Messages
    14 512
    Détails du profil
    Informations personnelles :
    Âge : 68
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Points : 20 985
    Points
    20 985
    Par défaut
    Citation Envoyé par clement_ Voir le message
    J'ai du mal formuler ma question, merci de t'être penché dessus.
    Je sais qu'un bloc alloué par malloc est contigu.
    Alors problème réglé.
    Imaginons que SIZE_MAX = 100 (ce qui n'est pas vrai mais je prends la valeur 100 parce que c'est + pratique), est-il possible que le bloc renvoyé par malloc(5) soit constitué des octets n° 99, 100, 0, 1, 2 ? Ce bloc est contigu vu qu'en modulo (SIZE_MAX+1), 100+1 = 0.

    Voilà, j'espère avoir été plus clair.
    J'avais parfaitement compris, et dans ce cas les adresses n'étant pas contigües, malloc() retourne NULL. Ne va pas chercher des complication là où il n'y en a pas. Tu n'as aucune idée de la façon dont sont organisées les adresses logiques. Tu n'as pas à t'en préoccuper. malloc() fait son boulot et il le fait bien.

  5. #5
    Candidat au Club
    Profil pro
    Inscrit en
    Octobre 2007
    Messages
    3
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2007
    Messages : 3
    Points : 2
    Points
    2
    Par défaut merci
    ok, merci

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. L'adresse d'un char renvoyé par une fonction ?
    Par tintin72 dans le forum C++
    Réponses: 5
    Dernier message: 17/10/2007, 12h05
  2. Réponses: 1
    Dernier message: 28/09/2007, 16h59
  3. Réponses: 2
    Dernier message: 08/10/2006, 12h44
  4. [SQL] php et recuperation d'une valeur renvoyée par une fonction sql
    Par highman dans le forum PHP & Base de données
    Réponses: 2
    Dernier message: 21/06/2006, 16h42
  5. [LG]résultat renvoyé par une fonction
    Par le 27 dans le forum Langage
    Réponses: 3
    Dernier message: 10/12/2003, 11h31

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