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 :

Question sur les chaines de char


Sujet :

C

  1. #1
    Membre à l'essai
    Profil pro
    Inscrit en
    Mai 2006
    Messages
    25
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France

    Informations forums :
    Inscription : Mai 2006
    Messages : 25
    Points : 24
    Points
    24
    Par défaut Question sur les chaines de char
    Bonjour,

    Pourquoi lorsque je fais ca :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    #include <stdio.h>
    #include <string.h>
    #include <stdlib.h>
     
    int main(int argc, char **argv)
    {
        char *s = malloc(sizeof(*s) * 10);
        s = "plooooooooooooooooooooooooooooooooop";
        printf("%d - %d - %s\n", (int)sizeof(*s) * 10, (int)strlen(s), s);
    }
    qui donne ce resultat : 10 - 36 - plooooooooooooooooooooooooooooooooop

    me retourne pas d'erreurs ? Je malloc pour 10 char mais je peux ajouter une chaine de 36 char sans pauser de prob ?!

  2. #2
    Expert éminent sénior
    Avatar de diogene
    Homme Profil pro
    Enseignant Chercheur
    Inscrit en
    Juin 2005
    Messages
    5 761
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Enseignant Chercheur
    Secteur : Enseignement

    Informations forums :
    Inscription : Juin 2005
    Messages : 5 761
    Points : 13 926
    Points
    13 926
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
        char *s = malloc(sizeof(*s) * 10);
        s = "plooooooooooooooooooooooooooooooooop";
    La première ligne alloue 10 char et met l'adresse dans s.
    La deuxième ligne écrase la valeur obtenue précédemment pour mettre à la place l'adresse d'une chaine non modifiable (codée ailleurs quelque part en mémoire).

    Le résultat est une fuite de mémoire assurée puisqu'on ne peut plus faire de free().

    La confusion est qu'on ne copie pas une chaine de caractères simplement avec l'opérateur = mais il faut utiliser une fonction comme strcpy() (ou tout autre moyen qui recopie caractère par caractère une chaine dans l'autre)
    Publication : Concepts en C

    Mon avatar : Glenn Gould

    --------------------------------------------------------------------------
    Une réponse vous a été utile ? Remerciez son auteur en cliquant le pouce vert !

  3. #3
    Membre à l'essai
    Profil pro
    Inscrit en
    Mai 2006
    Messages
    25
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France

    Informations forums :
    Inscription : Mai 2006
    Messages : 25
    Points : 24
    Points
    24
    Par défaut
    Ok, merci pour votre réponse. Maintenant, si je fais :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    char *s = malloc(sizeof(*s)*10);
    s[2] = 'a'; # je mets bien un char 'a' à la position 3 de mon tableau de char
    mais si je fais :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    s[12] = 'b'; # que ce passe t'il ?
    Je vais pas avoir d'erreur lors de l’exécution pourtant c'est faux. Je suis 'out of memory'

  4. #4
    Membre éprouvé
    Avatar de afranck64
    Homme Profil pro
    Étudiant
    Inscrit en
    Janvier 2009
    Messages
    592
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 32
    Localisation : Cameroun

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Janvier 2009
    Messages : 592
    Points : 1 006
    Points
    1 006
    Par défaut
    Bonjour,
    Le fait est qu en C, la verication des tailles limites des tableaux n est pas faite par les compilateurs. En partie pour eviter des tests qui pourrait etre refais par le programmeur. Donc c est a lui de verifier a chaque l incide de l element au il demande a son tableau.
    mais si je fais :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    s[12] = 'b'; # que ce passe t'il ? Je vais pas avoir d'erreur lors de l’exécution
    pourtant c'est faux. Je suis 'out of memory'
    Ton compilateur va juste essayer de loger le char 'b' a . adress(s)+3. Et si ce bloc n est pas proteger alors il te dit pas de souci, mais dans le cas contraire il y a bien erreur.
    Win 10 64 bits / Linux Mint 18, - AMD A6 Quad: Py27 / Py35
    CONTENU D'UNE QUESTION
    Exemples:
    - Configuration (système d'exploitation, version de Python et des bibliothèques utilisées)
    - Code source du morceau de programme où il y a un bogue
    - Ligne de code sur laquelle le bogue apparaît
    - Erreur complète retournée pas l'interpréteur Python
    - Recherche déjà effectuée (FAQ, Tutoriels, ...)
    - Tests déjà effectués

  5. #5
    Expert éminent sénior
    Avatar de diogene
    Homme Profil pro
    Enseignant Chercheur
    Inscrit en
    Juin 2005
    Messages
    5 761
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Enseignant Chercheur
    Secteur : Enseignement

    Informations forums :
    Inscription : Juin 2005
    Messages : 5 761
    Points : 13 926
    Points
    13 926
    Par défaut
    mais si je fais :
    que ce passe t'il ? Je vais pas avoir d'erreur lors de l’exécution pourtant c'est faux. Je suis 'out of memory'
    Le comportement est imprévisible : le programme peut planter immédiatement, ou plus tard dans l'exécution du programme ou de temps en temps lorsqu'on l'exécute plusieurs fois ou sur une autre machine ou dans 10 ans ou ...

    On doit considérer qu'un tel code détruit le programme qui devient alors incontrôlable.
    Publication : Concepts en C

    Mon avatar : Glenn Gould

    --------------------------------------------------------------------------
    Une réponse vous a été utile ? Remerciez son auteur en cliquant le pouce vert !

  6. #6
    Membre à l'essai
    Profil pro
    Inscrit en
    Mai 2006
    Messages
    25
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France

    Informations forums :
    Inscription : Mai 2006
    Messages : 25
    Points : 24
    Points
    24
    Par défaut
    Ok, merci pour vos réponses.

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

Discussions similaires

  1. question sur les chaines de caractère
    Par yacin87 dans le forum Débuter avec Java
    Réponses: 1
    Dernier message: 10/04/2010, 08h59
  2. question sur les chaine de caractere en c
    Par zazloux dans le forum C
    Réponses: 7
    Dernier message: 06/11/2007, 10h34
  3. [Système] 2 questions sur les chaines de charctères
    Par prologO dans le forum Langage
    Réponses: 15
    Dernier message: 22/10/2006, 16h53
  4. question sur les chaine de caractères
    Par amy0o0 dans le forum C
    Réponses: 11
    Dernier message: 14/10/2006, 14h14
  5. question sur les chaines de caractères
    Par pierrOPSG dans le forum C
    Réponses: 5
    Dernier message: 13/04/2006, 18h55

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