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 :

Allocation de memoire


Sujet :

C

  1. #1
    Membre à l'essai
    Inscrit en
    Mars 2005
    Messages
    15
    Détails du profil
    Informations forums :
    Inscription : Mars 2005
    Messages : 15
    Points : 11
    Points
    11
    Par défaut Allocation de memoire
    Salut tout le monde j'ai un petit souci a propos de l'allocation de la memoire dans un programme, la question est que je ne comprend pas tjrs quand est ce qu'il faut faie allocation et quand est ce que ca n'est pas necessaire exemple:


    char * ptrchaine = "une autre";

    ceci ne necessite-t-il pas une allocation avant d'inserer la chaine de caractere "une autre"???

    et aussi est ce que la declaration d'un tableau est une auto allocation en meme temps ???


  2. #2
    Membre régulier
    Profil pro
    Inscrit en
    Mai 2004
    Messages
    66
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : Mai 2004
    Messages : 66
    Points : 90
    Points
    90
    Par défaut Re: Allocation de memoire
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    char * ptrchaine  = "une autre";
    Va creer une chaine "constante" (non modifiable) et allouer la memoire dans chaine directement.

    Par contre :
    char *chaine;

    chaine = "une autre";
    N'aurait pas marche

    et aussi est ce que la declaration d'un tableau est une auto allocation en meme temps ???
    Un tableau est alloue de la taille de ses elements :
    Prendra 200 chars .. par contre sa valeur n'est pas initialisee par defaut !

  3. #3
    Membre régulier
    Profil pro
    Inscrit en
    Janvier 2005
    Messages
    131
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2005
    Messages : 131
    Points : 114
    Points
    114
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    char *chaine;
    chaine = "une autre";
    Je pense que ceci marche bien. Je ne vois pas pourquoi ca ne marcherait pas. C est une declaration comme les autres non?

  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 : 67
    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 Re: Allocation de memoire
    Citation Envoyé par DavG
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    char * ptrchaine  = "une autre";
    Va creer une chaine "constante" (non modifiable) et allouer la memoire dans chaine directement.
    Gni ? Un pointeur sur char nommé 'ptrchaine' est créé. Il est initialisé avec l'adresse d'une chaine non modifiable. Il eût été préférable d'écrire :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    char const * ptrchaine  = "une autre";
    Par contre :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    char *chaine;
     
    chaine = "une autre";
    N'aurait pas marche
    Meuh ? T'as essayé ?

    Tu confonds avec
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    char chaine[123];
     
    chaine = "une autre";
    Ca effectivement, c'est une erreur de syntaxe. (On ne sait pas 'assigner' un tableau ou une chaine en C)

    Un tableau et un pointeur sont des choses différentes. Très différentes.

  5. #5
    Membre à l'essai
    Inscrit en
    Mars 2005
    Messages
    15
    Détails du profil
    Informations forums :
    Inscription : Mars 2005
    Messages : 15
    Points : 11
    Points
    11
    Par défaut
    est ce qu'on ne peut pas faire ??


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
       char *chaine=(char *)malloc(sizeof(char)*10); 
       chaine="une autre";

  6. #6
    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 : 67
    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 zakjo_developper
    est ce qu'on ne peut pas faire ??
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
       char *chaine=(char *)malloc(sizeof(char)*10); 
       chaine="une autre";
    Si, mais à part que ça créée une fuite mémoire, c'est pareil que

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
       char *chaine; 
       chaine="une autre";
    Assigner deux fois de suite la même variable est souvent le signe d'une erreur de conception (expression 'politiquement correcte' pour dire 'connerie')

  7. #7
    Membre à l'essai
    Inscrit en
    Mars 2005
    Messages
    15
    Détails du profil
    Informations forums :
    Inscription : Mars 2005
    Messages : 15
    Points : 11
    Points
    11
    Par défaut
    Donc si j'ai compris le code::



    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
       char *chaine=(char *)malloc(sizeof(char)*10); 
       chaine="une autre";
    allouera l'espace et fera pointer chaine sur cet espace et en dernier fait deplacer chaine pour que ce dernier pointe sur la chaine fixe "une autre". ce qui cree une fuite de memoire car on ne peut plus localiser le bloque qu'on avait creer au debut?????

  8. #8
    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 : 67
    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 zakjo_developper
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
       char *chaine=(char *)malloc(sizeof(char)*10); 
       chaine="une autre";
    allouera l'espace et fera pointer chaine sur cet espace et en dernier fait deplacer chaine pour que ce dernier pointe sur la chaine fixe "une autre". ce qui cree une fuite de memoire car on ne peut plus localiser le bloque qu'on avait creer au debut?
    Le bloc!

    Exactement. Le bloc est perdu, et il ne peut plus être libéré.

  9. #9
    Membre à l'essai
    Inscrit en
    Mars 2005
    Messages
    15
    Détails du profil
    Informations forums :
    Inscription : Mars 2005
    Messages : 15
    Points : 11
    Points
    11
    Par défaut
    mais quand meme une syntaxe comme la suivante est possible? ::



    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
       char *chaine=(char *)malloc(sizeof(char)*10);
       strcpy(chaine,"une autre");
    et a ce que je vois je peux tres bien considerer que la chaine de caractere est un tableau et donc la chaine "une autre" renvoi comme pour le cas de la fonction malloc l'adresse du premier element qui est ici "u".[/code]

  10. #10
    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 : 67
    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 zakjo_developper
    mais quand meme une syntaxe comme la suivante est possible? ::

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
       char *chaine=(char *)malloc(sizeof(char)*10);
       strcpy(chaine,"une autre");
    Oui, mais ce n'est pas sécurisé et inutilement compliqué :
    • le cast est inutile
    • sizeof (char) vaut 1 par définition.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
       char *chaine = malloc (10);
       if (chaine != NULL)
       {
          strcpy (chaine, "une autre");
       }

  11. #11
    Membre régulier
    Profil pro
    Inscrit en
    Décembre 2004
    Messages
    132
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2004
    Messages : 132
    Points : 75
    Points
    75
    Par défaut
    Citation Envoyé par Emmanuel Delahaye
    Oui, mais ce n'est pas sécurisé et inutilement compliqué :
    • le cast est inutile
    • sizeof (char) vaut 1 par définition.
    C'est vrai que pour ce cas c'est relativement inutile.

    Par contre, le cast n'est a mon gout pas inutile : ca permet d'éviter d'avoir des warnings (evidemment sans aller s'embetter a chercher les options dans l'IDE).

    Et puis c'est pas inutile du tout de mettre sizeof(char).
    Je dirais que c'est meme conseillé.
    Car si l'application est faite pour durer, il est possible que le jour où quelqu'un reprend le code.
    Et dans ce cas, non seulement la comprehension est aisée mais en plus, s'il y a eu un changement de format de type entre temps, ca peut éviter des désagrements ...
    L'été dernier, j'étais en stage dans une société et je ne les mettais pas moi non plus. Jusqu'au jour où un développeur qui bosse depuis 20 ans et venu voir mon code en me disant que c'était pas top car ils avaient déjà été embettés avec ca il y a quelques années lors du changement de taille des int.

    donc meme si char a peu de chances de changer d'ici demain, dans 10 ans, on ne sait pas trop ...
    Voilou

  12. #12
    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 : 67
    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 Worldofdada
    Par contre, le cast n'est a mon gout pas inutile : ca permet d'éviter d'avoir des warnings (evidemment sans aller s'embetter a chercher les options dans l'IDE).
    Gni ? Un cast n'a jamais servi a cacher un warning. Il faut d'abord en comprendre la cause et la corriger. Je parirais pour une absence de <stdlib.h>
    Et puis c'est pas inutile du tout de mettre sizeof(char).
    Je dirais que c'est meme conseillé.
    Car si l'application est faite pour durer, il est possible que le jour où quelqu'un reprend le code.
    Et dans ce cas, non seulement la comprehension est aisée mais en plus, s'il y a eu un changement de format de type entre temps, ca peut éviter des désagrements ...
    Ok. Si ce risque existe, il est préférable d'utiliser une syntaxe indépendante du type:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    char *chaine = malloc (10 * sizeof *chaine);
    http://emmanuel-delahaye.developpez....tes.htm#malloc

  13. #13
    Membre régulier
    Profil pro
    Inscrit en
    Mai 2004
    Messages
    66
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : Mai 2004
    Messages : 66
    Points : 90
    Points
    90
    Par défaut Re: Allocation de memoire
    Citation Envoyé par Emmanuel Delahaye
    Gni ?
    Ca veut dire quoi "Gni" ???

    Un pointeur sur char nommé 'ptrchaine' est créé. Il est initialisé avec l'adresse d'une chaine non modifiable. Il eût été préférable d'écrire
    C'est plus propre en effet, mais ca revient au meme

    Meuh ? T'as essayé ?

    Tu confonds avec
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    char chaine[123];
     
    chaine = "une autre";
    En fait j'avais tape un peu vite et je pensais plus a un simple
    char *chaine;
    strcpy (chaine, "une autre);
    .. desole de n'avoir pas teste

  14. #14
    Rédacteur/Modérateur
    Avatar de Trap D
    Profil pro
    Inscrit en
    Septembre 2003
    Messages
    4 942
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2003
    Messages : 4 942
    Points : 6 498
    Points
    6 498
    Par défaut Re: Allocation de memoire
    Citation Envoyé par DavG
    En fait j'avais tape un peu vite et je pensais plus a un simple
    char *chaine;
    strcpy (chaine, "une autre);
    .. desole de n'avoir pas teste
    Dommage, car tu aurais vu que ton dernier bout de code plante : tu copies une chaîne dans un pointeur non initialisé par un malloc de la bonne taille ==> Grosse plante.

  15. #15
    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 : 45
    Localisation : France, Isère (Rhône Alpes)

    Informations forums :
    Inscription : Juin 2002
    Messages : 2 165
    Points : 4 637
    Points
    4 637
    Par défaut
    Citation Envoyé par Worldofdada
    Et puis c'est pas inutile du tout de mettre sizeof(char).
    Je dirais que c'est meme conseillé.
    Car si l'application est faite pour durer, il est possible que le jour où quelqu'un reprend le code.
    Et dans ce cas, non seulement la comprehension est aisée mais en plus, s'il y a eu un changement de format de type entre temps, ca peut éviter des désagrements ...
    L'été dernier, j'étais en stage dans une société et je ne les mettais pas moi non plus. Jusqu'au jour où un développeur qui bosse depuis 20 ans et venu voir mon code en me disant que c'était pas top car ils avaient déjà été embettés avec ca il y a quelques années lors du changement de taille des int.
    Le probleme est totalement different : sizeof(char) vaut 1 par definition donc c'est totalement inutile.
    Le cas qui est arrive a ton collegue est visiblement que quelqu'un utilise un tableau de int et qu'il avait reserve une taille en dur (par exemple dans le cas de 10 int dans un environnement ou la taille des ints est 2 : malloc(20) et la effectivement le jour ou la taille change, par exemple passe a 4, tu n'as plus que 5 int d'alloue).

    Une solution largement preferable est sans doute celle proposee par Emmanuel, car ainsi meme un changement de type est sans risque au niveau du malloc.

  16. #16
    Membre à l'essai
    Inscrit en
    Mars 2005
    Messages
    15
    Détails du profil
    Informations forums :
    Inscription : Mars 2005
    Messages : 15
    Points : 11
    Points
    11
    Par défaut
    salut tout le monde je crois que j'ai compris un peu les regles avec les chaines de caracteres et leur manipulation, je tiens à vous remercier tous de votre aide et j'avoue que ça m'a permis de comprendre plein de choses.


    Encore mille fois merci pour tout le monde .

  17. #17
    Membre régulier
    Profil pro
    Inscrit en
    Mai 2004
    Messages
    66
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : Mai 2004
    Messages : 66
    Points : 90
    Points
    90
    Par défaut Re: Allocation de memoire
    Citation Envoyé par Trap D
    Citation Envoyé par DavG
    En fait j'avais tape un peu vite et je pensais plus a un simple
    char *chaine;
    strcpy (chaine, "une autre);
    .. desole de n'avoir pas teste
    Dommage, car tu aurais vu que ton dernier bout de code plante : tu copies une chaîne dans un pointeur non initialisé par un malloc de la bonne taille ==> Grosse plante.
    Celui-la je le savais .. je parlais de code qui ne marcherait pas, pas de code qui marcherait dans ce cas-la

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

Discussions similaires

  1. Allocation de memoire
    Par remi77 dans le forum Windows XP
    Réponses: 5
    Dernier message: 22/06/2007, 17h01
  2. ERROR allocation de memoire
    Par insa59 dans le forum GTK+ avec C & C++
    Réponses: 7
    Dernier message: 15/03/2007, 09h50
  3. allocation de memoire pour char**
    Par Guillaume602 dans le forum C++
    Réponses: 3
    Dernier message: 03/04/2006, 20h01
  4. outil permettant de tracker les alloc/dealloc memoire
    Par bob8181_2000 dans le forum C++Builder
    Réponses: 2
    Dernier message: 03/09/2005, 19h57
  5. char * et Allocation de memoire
    Par venomelektro dans le forum C++
    Réponses: 3
    Dernier message: 14/10/2004, 13h24

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