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 :

Probleme de tableau de caractère


Sujet :

C

  1. #1
    Membre régulier
    Profil pro
    Inscrit en
    Décembre 2007
    Messages
    560
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2007
    Messages : 560
    Points : 71
    Points
    71
    Par défaut Probleme de tableau de caractère
    Bonjour,
    j'ai un problème quand j'utilise un tableau de caractère.
    Je fais donc
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    char *Mot ="truc";
    Mot[0]='c';
    Ca fait une erreur ...Mais quand je fais
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    char Mot[5] ="truc";
    Mot[0]='c';
    Ca marche. Le problème vient de ou?
    Si quelqu'un pouvait m'aider. D'avance merci.

  2. #2
    Membre régulier Avatar de florianjoy54
    Profil pro
    Inscrit en
    Octobre 2009
    Messages
    155
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2009
    Messages : 155
    Points : 91
    Points
    91
    Par défaut
    quand tu fais
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    char Mot[5] = "truc";
    tu attribues une taille a ton tableau. qui est en fait un char *.

    Donc quand tu déclare un char * Mot;

    il faut aussi que tu lui alloue de la mémoire. Une taille.
    donc il faut que tu utilises malloc

    Mot = malloc(5 * sizeof(char

    est ce que ton erreur était de type segmention fault ou en français erreur de segmentation ?
    Force et Honneur, Courage et Culture, sans peur ni reproche

  3. #3
    Membre régulier
    Profil pro
    Inscrit en
    Décembre 2007
    Messages
    560
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2007
    Messages : 560
    Points : 71
    Points
    71
    Par défaut Re
    En fait le problème vient de la deuxieme ligne pas de la primière.
    Oui c'est une erreur de segmentation.

  4. #4
    Membre régulier Avatar de florianjoy54
    Profil pro
    Inscrit en
    Octobre 2009
    Messages
    155
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2009
    Messages : 155
    Points : 91
    Points
    91
    Par défaut
    il faut juste que tu fasse un malloc et ca fonctionnera. Sinon ca veut dire que tu tentes d'accéder a un espace qui n'est pas alloué, qui n'est pas destiné a ta variable.
    Force et Honneur, Courage et Culture, sans peur ni reproche

  5. #5
    Membre régulier
    Profil pro
    Inscrit en
    Décembre 2007
    Messages
    560
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2007
    Messages : 560
    Points : 71
    Points
    71
    Par défaut Re
    Pourtant il existe quand meme cette variable dans le cas ou je fait char *Mot ="truc" parce que lorsque je fais printf de la variable j'ai bien le mot truc qui apparait. Ca viendrait de ou le probleme ??
    La variable est stocké dans un endroit de la mémoire où on a pas le droit de touché ?

  6. #6
    Membre chevronné
    Profil pro
    Inscrit en
    Août 2006
    Messages
    1 104
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2006
    Messages : 1 104
    Points : 1 750
    Points
    1 750
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    char *Mot ="truc";
    Mot[0]='c';
    Mot est un pointeur (pas un tableau) pointant vers une chaine de caractères contenant "truc" et cette chaine de caractères se trouve dans une zone en lecture seule.
    Si tu veux modifier un caractère dedans, ça plante.

    Là, par contre, tu créées un tableau (et non plus un pointeur) sur la pile d'exécution, qui est initialisé avec "truc".
    Comme il se trouve dans une zone qui permet aussi bien la lecture que l'écriture, tu peux donc le modifier comme bon te semble.

    Ne pas confondre tableau et pointeur, c'est pas du tout la même chose.

    Par contre, il n'y a pas besoin de malloc pour aussi peu de caractères. Un tableau est suffisant.

  7. #7
    Membre régulier
    Profil pro
    Inscrit en
    Décembre 2007
    Messages
    560
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2007
    Messages : 560
    Points : 71
    Points
    71
    Par défaut Re
    Merci pour cette réponse.
    En fait quand on crée un tableau t[n] de n'importe quel type, il l'alloue dans une partie de la mémoire accéssible en écriture/lecture, il fait automatiquement le malloc en quelque sorte?

  8. #8
    Expert éminent
    Avatar de Melem
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Janvier 2006
    Messages
    3 656
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Janvier 2006
    Messages : 3 656
    Points : 8 389
    Points
    8 389
    Par défaut
    En quelque sorte. Et surtout, il fait automatiquement le free aussi.

    En réalité, t[n] crée le tableau dans une zone de la mémoire destinée à stocker des objets temporaires (variables locales des fonctions, arguments des fonctions, etc.), couramment appelée "pile" (stack en anglais) tandis que malloc crée le tableau dans une zone de la mémoire réservée aux objets permanents (variables globales, etc.), courrament appelée le "tas" (heap en anglais). La capacité de la pile est généralement faible tandis que celle du tas est généralement énorme, mais la pile est plus facile à manipuler que le tas.

  9. #9
    Membre régulier
    Profil pro
    Inscrit en
    Décembre 2007
    Messages
    560
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2007
    Messages : 560
    Points : 71
    Points
    71
    Par défaut Re
    Oki merci pour la réponse.

  10. #10
    Membre émérite
    Avatar de skeud
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Juin 2011
    Messages
    1 091
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2011
    Messages : 1 091
    Points : 2 724
    Points
    2 724
    Billets dans le blog
    1
    Par défaut
    Bonjour bonjour, techniquement on chope une erreur de type "bus error" et non pas "segfault" non?
    Pas de solution, pas de probleme

    Une réponse utile (ou +1) ->
    Une réponse inutile ou pas d'accord -> et expliquer pourquoi
    Une réponse à votre question


  11. #11
    Expert éminent
    Avatar de Melem
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Janvier 2006
    Messages
    3 656
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Janvier 2006
    Messages : 3 656
    Points : 8 389
    Points
    8 389
    Par défaut
    Si, c'est bien un segfault. On peut intercepter le signal avec les fonctions de la bibliothèque signal.

  12. #12
    Membre émérite
    Avatar de skeud
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Juin 2011
    Messages
    1 091
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2011
    Messages : 1 091
    Points : 2 724
    Points
    2 724
    Billets dans le blog
    1
    Par défaut
    Ah perso, quand je modifie une chaine déclarer en statique, je chope un bus error .

    Peut-être du à une config, je sais pas.
    Pas de solution, pas de probleme

    Une réponse utile (ou +1) ->
    Une réponse inutile ou pas d'accord -> et expliquer pourquoi
    Une réponse à votre question


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

Discussions similaires

  1. [CR8.5] Probleme de tableau
    Par Sto59 dans le forum SAP Crystal Reports
    Réponses: 2
    Dernier message: 21/02/2007, 15h07
  2. Réponses: 3
    Dernier message: 14/11/2006, 10h45
  3. probleme de tableau dynamique
    Par El Krotal dans le forum C
    Réponses: 9
    Dernier message: 25/06/2004, 17h00
  4. Probleme de chaine de caractéres et Insert
    Par Revan012 dans le forum ASP
    Réponses: 5
    Dernier message: 21/06/2004, 10h28
  5. [C#] Probleme de tableau
    Par djsbens dans le forum Windows Forms
    Réponses: 8
    Dernier message: 08/06/2004, 14h04

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