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 en C


Sujet :

C

  1. #1
    Membre éclairé
    Homme Profil pro
    Programmeur PHP
    Inscrit en
    Août 2009
    Messages
    244
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : Israël

    Informations professionnelles :
    Activité : Programmeur PHP
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Août 2009
    Messages : 244
    Par défaut allocation en C
    salut ,
    je cherche un peu a aprofondir mes connaissances en C.
    J'ai le petit bout de code suivant:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    char* str2 = (char*) malloc(sizeof (char)*30);
    	str2 = "bisounours";
    je voulais faire en sorte d'allouer a str2 une place dans la memoire, pour ensuite (a la ligne suivante) atribuer une valeur dans cette place memoire.
    Seulement voila, je remarque que mon OS a file a str2 une toute autre adresse.
    Pourquoi c'est comme ca?

  2. #2
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Mai 2006
    Messages
    6
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2006
    Messages : 6
    Par défaut
    Bonsoir,

    A la 2e ligne, tu a affecté à str2 l'adresse de la zone mémoire qui contient la chaîne constante "bisounours"

    Il faut utiliser la fonction "strcpy" pour copie la valeur "bisounours" dans la zone que tu as alloué par malloc.

  3. #3
    Membre éclairé
    Homme Profil pro
    Programmeur PHP
    Inscrit en
    Août 2009
    Messages
    244
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : Israël

    Informations professionnelles :
    Activité : Programmeur PHP
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Août 2009
    Messages : 244
    Par défaut
    ce que tu me dis semble logique, mais me parait tout de meme un peu bizarre
    Admettons une troisieme ligne ou j'ecrirai:
    d'apres ce que tu me racontes, je devrais voir str2 pointer vers l'adresse en memoire ou "coucou" est ecrit?!

    Tu as raison, j'ai teste.... Et c'est exactement ce qui se passe?!
    Je comprends pas trop....

  4. #4
    Membre éclairé
    Homme Profil pro
    Programmeur PHP
    Inscrit en
    Août 2009
    Messages
    244
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : Israël

    Informations professionnelles :
    Activité : Programmeur PHP
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Août 2009
    Messages : 244
    Par défaut pointeur et passage a fonctions
    Permets moi de poser une autre questions pas trop en rapport avec le sujet de ce topic.

    admetons que j'ai dans le main 2 char* que je passe a une fonction void foo(char* str1, char* str2).
    Dans le corps de cette fonction je manipule les pointeurs str1 et str2 (je les fais pointer ailleur).
    Je remarque tout de meme que lorsque je reviens dans le main les pointeurs pointent a leurs adresses d'origine.

    Que s'est il passe?
    merci

  5. #5
    Invité
    Invité(e)
    Par défaut
    Bonsoir,

    Ne serait-ce pas plutôt ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    char* str2 = (char*) malloc(sizeof (char)*30);
    strcpy(str2 , "bisounours");
    que tu souhaites faire ? Allouer l'espace mémoire, et y recopier la chaine "bisounours" ? (Comme te l'a indiqué darth_vader).

    Citation Envoyé par IsraGab Voir le message
    admetons que j'ai dans le main 2 char* que je passe a une fonction void foo(char* str1, char* str2).
    Dans le corps de cette fonction je manipule les pointeurs str1 et str2 (je les fais pointer ailleur).
    Je remarque tout de meme que lorsque je reviens dans le main les pointeurs pointent a leurs adresses d'origine.
    C'est normal, tu travailles sur des copies des pointeurs, la seule chose que tu peux changer, c'est le contenu de l'adresse vers laquelle ils pointent, et non l'adresse.
    Si tu veux pouvoir faire cela, il te faut passer un pointeur de pointeur :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    void foo(char** str)
     
    *str = ...

  6. #6
    Membre éclairé
    Homme Profil pro
    Programmeur PHP
    Inscrit en
    Août 2009
    Messages
    244
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : Israël

    Informations professionnelles :
    Activité : Programmeur PHP
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Août 2009
    Messages : 244
    Par défaut
    Merci,
    C'est normal, tu travailles sur des copies des pointeurs, la seule chose que tu peux changer, c'est le contenu de l'adresse vers laquelle ils pointent, et non l'adresse.
    Si tu veux pouvoir faire cela, il te faut passer un pointeur de pointeur :
    Ou bien une reference, non?

  7. #7
    Modérateur

    Avatar de Bktero
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2009
    Messages
    4 493
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Juin 2009
    Messages : 4 493
    Billets dans le blog
    1
    Par défaut
    Il n'y a pas de notion de référence en C. Cette notion est présente en C++.

    On rappelle le fondement de tout : un pointeur contient une adresse mémoire. Cette adresse est celle d'un élément mais on peut se débrouiller pour que les éléments suivants soient aussi à notre disposition. On utilise pour cela des fonctions telles que malloc(), qui vont demander au gestionnaire de mémoire de nous réserver un emplacement et vont renvoyer l'adresse du premier élément de ce bloc. C'est ce que fait ta ligne :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    char* str2 = (char*) malloc(sizeof (char)*30);
    La ligne est très trompeuse. Contrairement à où on copie la valeur 2 dans a, ici, on ne copie rien dans l'emplacement alloué pour str2 avec malloc(). La chaine littéralle "coucou" est placée par le compilateur dans un espace mémoire spécialement dédié aux constantes. Ici, on va donc donné à str2 comme l'adresse de cet emplacement !

    Regardons le code suivant :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    int b = 2;
    int *pa = &b;
    pa = 14;
    Ici, on n'est bien d'accord que b ne vaut pas 14 à la fin du code. Il y aurait fallu écrire :
    Alors, pourquoi écrire :
    modifierait-il ce vers quoi pointe str2 ? Il faudrait logiquement à la limite écrire :
    Mais pas de chance, ce n'est pas comme ça qu'on copie un ensemble de valeurs. Il faut utiliser la fonction strcpy() pour copier un ensemble de caractères (une chaine de caractères).
    En revanche, on pourrait écrire :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    *str2 = 'c';
    *str+1='o';
    *str+2='u';
    *str+3='c';
    *str+4='o';
    *str+5='u';
    *str+6='\0';
    Pour ta fonction, regarde celle là :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    void modifier(int a)
    {
        a = 14;
    }
     
    int main(void)
    {
        int b = 14;
        modifier(b);
        return b;
    }
    Ici, main() ne renverra pas 14. Tu es d'accord ? Alors, si tu ne peux pas modifier un int à l'intérieur d'une fonction, pourquoi pourrais-tu modifier un autre type de variable ? En C, les paramètres de fonctions sont passés par copie, quelque soit le type de ces paramètres.

  8. #8
    Expert confirmé
    Avatar de fred1599
    Homme Profil pro
    Lead Dev Python
    Inscrit en
    Juillet 2006
    Messages
    4 060
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Meurthe et Moselle (Lorraine)

    Informations professionnelles :
    Activité : Lead Dev Python
    Secteur : Arts - Culture

    Informations forums :
    Inscription : Juillet 2006
    Messages : 4 060
    Par défaut
    je voulais faire en sorte d'allouer a str2 une place dans la memoire, pour ensuite (a la ligne suivante) atribuer une valeur dans cette place memoire.
    Seulement voila, je remarque que mon OS a file a str2 une toute autre adresse.
    Pourquoi c'est comme ca?
    Le problème est que si tu fais une modification, sur cette chaîne il y aura un comportement indéterminé.

    La bonne manière serait de faire comme ci-dessous pour éviter ce comportement.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    const char *str2 = "bisounours";
    Pour faire des modification utiliser strcpy et suivre les indications des posteurs du haut.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    char *str2 = malloc(sizeof(*str2) * 30);
    /* ... */
    free(str2);
    Ne pas oublier le free

Discussions similaires

  1. Allocation dynamique de structures
    Par fr_knoxville dans le forum C
    Réponses: 8
    Dernier message: 06/05/2003, 21h59
  2. Allocation dynamique de mémoire en asm
    Par narmataru dans le forum Assembleur
    Réponses: 7
    Dernier message: 17/12/2002, 22h31
  3. Réponses: 4
    Dernier message: 03/12/2002, 16h47
  4. [Turbo Pascal] Allocation et désallocation de pointeurs dans une fonction
    Par neird dans le forum Turbo Pascal
    Réponses: 13
    Dernier message: 17/11/2002, 20h14
  5. Allocation de ressources
    Par Eric Pasquier dans le forum Algorithmes et structures de données
    Réponses: 4
    Dernier message: 08/10/2002, 09h19

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