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 :

Comment connaître la valeur d'une variable qui a été allouée dynamiquement


Sujet :

C

  1. #1
    Membre éprouvé
    Avatar de beegees
    Homme Profil pro
    Développeur Web
    Inscrit en
    Mars 2004
    Messages
    3 610
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : Belgique

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : Enseignement

    Informations forums :
    Inscription : Mars 2004
    Messages : 3 610
    Points : 1 277
    Points
    1 277
    Par défaut Comment connaître la valeur d'une variable qui a été allouée dynamiquement
    Bonjour tout le monde,

    J'ai cette ligne :

    char* Copie = (char*)malloc((strlen(Ligne)+1)*sizeof(char));

    qui me permet de créer dynamiquement une variable de type char qui aura la grandeur d'une certaine ligne.

    Ma question :

    Comment puis-je connaitre la taille de Copie ?

    J'ai essayé strlen(Copie) mais j'obtiens void.

    Merci d'avance pour votre aide.

    beegees

  2. #2
    Expert éminent sénior
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 721
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2006
    Messages : 12 721
    Points : 31 044
    Points
    31 044
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par beegees Voir le message
    Bonjour tout le monde,

    J'ai cette ligne :

    char* Copie = (char*)malloc((strlen(Ligne)+1)*sizeof(char));

    qui me permet de créer dynamiquement une variable de type char qui aura la grandeur d'une certaine ligne.

    Ma question :

    Comment puis-je connaitre la taille de Copie ?
    c'est "(strlen(Ligne) + 1) * sizeof(char)"

    Citation Envoyé par beegees Voir le message
    J'ai essayé strlen(Copie) mais j'obtiens void.
    Il est réellement étonnant d'obtenir un type alors que la fonction renvoie un nombre.
    Cependant la fonction "strlen()" a pour but de compter le nombre de caractères d'une chaîne. Cela implique que tu lui donnes en entrée une chaîne c.a.d. un tableau de caractères contenant quelque part le caractère '\0'.
    Si tu n'as pas mis toi-même, à la main ou via une fonction de création de chaîne, ce caractère '\0' ben tu n'as pas une chaîne donc tu peux pas passer par strlen(). C'est aussi simple que ça.

    Concernant ta demande première => c'est toi qui gère ta mémoire de bout en bout. Tu as alloué ton tableau donc tu connais sa taille. Si t'as besoin de connaître cette taille dans une autre fonction de ton programme ben faut que tu passes cette taille à ladite fonction.
    Si ça te gonfle parce que la contrainte est trop lourde ben tu crées une structure qui contient
    - le tableau alloué
    - la taille du tableau
    et partout où tu envoies ce tableau en paramètre tu remplaces par l'adresse de la structure => la fonction recevant l'adresse de la structure aura accès
    - au tableau
    - à la taille

  3. #3
    Membre régulier Avatar de siegfried64
    Profil pro
    Inscrit en
    Novembre 2007
    Messages
    78
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : Maroc

    Informations forums :
    Inscription : Novembre 2007
    Messages : 78
    Points : 98
    Points
    98
    Par défaut
    strlen() calcule la taille d'une chaine du caracteres, autrement dit le nombre de caracteres avant le '\0' , quand tu alloue dynamiquement rien ne te dit que le caractere de fi de chaine existe, ce qui causera un comportement indefini du fonction strlen(),
    apart ca, je vois pas pourquoi tu tient a connaitre la taille du chaine alors que c'est toi qui a defini cette taille avec l allocation dynamique.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    char* Copie = (char*)malloc((strlen(Ligne)+1)*sizeof(char));
    donc la chaine copie contiendra strlen(Ligne)+1 caracteres ('\0' comprise)

  4. #4
    Membre averti Avatar de Pierre Maurette
    Profil pro
    Inscrit en
    Juillet 2002
    Messages
    283
    Détails du profil
    Informations personnelles :
    Âge : 68
    Localisation : France

    Informations forums :
    Inscription : Juillet 2002
    Messages : 283
    Points : 390
    Points
    390
    Par défaut
    Citation Envoyé par beegees Voir le message
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    char* Copie = (char*)malloc((strlen(Ligne)+1)*sizeof(char));
    Comment puis-je connaitre la taille de Copie ?
    La taille de Copie est par définition la valeur passée en argument à malloc().
    On ne doit pas caster le retour de malloc().
    Par définition, sizeof(char) vaut 1. On peut imaginer que l'écrire dans les arguments du malloc() a une valeur documentaire. A ce moment-là, écrivez plutôt:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    char* Copie = malloc((strlen(Ligne)+1) * sizeof *Copie);

  5. #5
    Expert éminent sénior
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 721
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2006
    Messages : 12 721
    Points : 31 044
    Points
    31 044
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par siegfried64 Voir le message
    donc la chaine copie contiendra strlen(Ligne)+1 caracteres ('\0' comprise)
    "copie" n'est pas une chaîne. C'est un tableau de char. Il n'y a pas forcément de '\0'.
    En revanche, ce que tu voulais probablement dire, c'est que si on remplit "copie" avec une chaîne, il faudra veiller à ce que le '\0' ait de l'espace pour se loger. C'est d'ailleurs la raison du "+1" après strlen() => on réserve pour "copie" l'espace nécessaire pour stocker tous les caractères de la ligne et aussi le '\0'....

  6. #6
    Membre éprouvé
    Avatar de beegees
    Homme Profil pro
    Développeur Web
    Inscrit en
    Mars 2004
    Messages
    3 610
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : Belgique

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : Enseignement

    Informations forums :
    Inscription : Mars 2004
    Messages : 3 610
    Points : 1 277
    Points
    1 277
    Par défaut
    Bonjour et merci à tous pour vos réponses.

    En effet, strlen ne peut calculer la taille que d'une chaine de caractère, je l'avais oublié !

    En plus, une chaine de caractère se termine par \0, autrement, ce n'est pas une chaine de caractère.

    Vos réponses m'ont beaucoup aidé, merci beaucoup !

    beegees

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

Discussions similaires

  1. [XSL] Comment modifier la valeur d'une variable?
    Par sorcer1 dans le forum XSL/XSLT/XPATH
    Réponses: 8
    Dernier message: 17/02/2010, 13h26
  2. Réponses: 5
    Dernier message: 18/06/2008, 09h50
  3. [VB]comment recupérer la valeur d'une variable ?
    Par budylove dans le forum VB 6 et antérieur
    Réponses: 4
    Dernier message: 20/02/2006, 14h35
  4. Réponses: 1
    Dernier message: 21/11/2005, 12h07
  5. Réponses: 2
    Dernier message: 16/08/2005, 09h43

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