langage C : probleme avec le caractere '\0'
Répondre à la discussion
Affichage des résultats 1 à 11 sur 11

langage C : probleme avec le caractere '\0'



  1. #1
    cosmoff

    langage C : probleme avec le caractere '\0'


    ------

    Bonjour,

    J'aimerai que la fonction printf affiche uniquement "cou", donc j'imagine que la fonction printf connait la taille de mon tableau de char en regardant quand est ce qu'il y a un caractere nul '\0'.

    voici mon code :

    Code:
    #include <stdio.h>
    #include <stdlib.h>
     
    int main(int argc, char const *argv[])
    {
    	char * str = "coucou";
    	str[3] = '\0';
     
    	printf("str = %s\n", str);
    	return 0;
    }
    Le probleme est lorsque que je lance le programme, j'ai un SEGFAULT.

    Avez vous une idée du probleme ?

    Merci d'avance

    -----

  2. #2
    PA5CAL

    Re : langage C : probleme avec le caractere '\0'

    Bonjour

    En l'état, str est juste un pointeur, et le programme l'initialise avec une adresse correspondant à une chaîne constante "coucou"(+'\0') stockée en mémoire programme. Le fait d'écrire un caractère '\0' à une adresse située 3 octets plus loin que le début de cette chaîne a donc pour conséquence d'écrire en mémoire programme, qui n'est pas censée être modifiée.

    Pour éviter ce problème, str doit être un tableau de caractères d'une taille suffisante (au moins 7 octets), initialisé avec les caractères "coucou"(+'\0') :

    Code:
    	char str[7] = "coucou";
    Dernière modification par PA5CAL ; 12/03/2019 à 15h26.

  3. #3
    PA5CAL

    Re : langage C : probleme avec le caractere '\0'

    La déclaration ci-dessus précise la taille de la chaîne souhaitée, qui peut être plus grande que 7 octets. Pour que la taille du tableau str soit fixée automatiquement à la taille minimale nécessaire à la chaîne d'initialisation (en l'occurrence 7 octets), on peut écrire :

    Code:
    	char str[] = "coucou";

  4. #4
    cosmoff

    Re : langage C : probleme avec le caractere '\0'

    merci beaucoup pour ta réponse. Et effectivement ca marche

    Je n'ai pas tres bien compris ton explication. Quand tu parles de mémoire programme, tu veux dire la RAM ? Quand tu initialises une variable dans le main, elle est stockée dans la pile, et donc on peut modifier la variable, pourquoi on ne peut pas ici ?

  5. A voir en vidéo sur Futura
  6. #5
    pm42

    Re : langage C : probleme avec le caractere '\0'

    Citation Envoyé par cosmoff Voir le message
    Je n'ai pas tres bien compris ton explication. Quand tu parles de mémoire programme, tu veux dire la RAM ?
    La ram est en fait séparée en plusieurs partie : une partie où le code exécutable est stocké, une partie où les constantes sont stockées, la pile et une partie pour les données allouées dynamiquement (malloc, etc).
    Les 2 premières sont en lecture seule.
    Cela a plusieurs avantages : on ne risque pas de corrompre involontairement son code binaire ou ses constantes, cela empêche certaines attaques informatiques et si tu lances ton programme plusieurs fois au même moment, cette mémoire est partagée entre tous et non pas copiée.

    Quand tu écris
    Code:
    char * str = "coucou";
    tu dis que ton pointeur str pointe vers une constante. Donc quand tu essaies de modifier, tu tapes dans la mémoire en lecture seule. D'où ton message.

    Note que parfois, suivant les langages et les compilateurs, le fait de stocker les chaînes de caractère comme cela permet aussi de les mettre 1 seule fois. En gros, si tu as écris la constante "coucou" 5 fois dans ton programme, il ne sera qu'une seule fois dans ton exécutable ce qui gagne de la place, de la vitesse de chargement...

  7. #6
    cosmoff

    Re : langage C : probleme avec le caractere '\0'

    ah ok je ne savais pas.

    Ca reste subtil que char *str = "coucou" est déclaré comme une constante et char str[] = "coucou" n'est pas une constante.

    surtout que les constantes sont généré generalement par const et ca plante à la compilation, ca reste sournois ce SEGFAULT

    En tout cas merci de l'info
    Dernière modification par cosmoff ; 13/03/2019 à 09h08.

  8. #7
    pm42

    Re : langage C : probleme avec le caractere '\0'

    Citation Envoyé par cosmoff Voir le message
    Ca reste subtil que char *str = "coucou" est déclaré comme une constante et char str[] = "coucou" n'est pas une constante.
    Oui, c'est subtil parce que c'est lié à un historique : sur certaines machines, cette protection mémoire n'existait pas.
    Et aussi parce que le C a toujours eu ce concept de tableau et de pointeur qui sont à la fois très liés et différents.

    Citation Envoyé par cosmoff Voir le message
    surtout que les constantes sont généré generalement par const
    Là aussi, const est récent et ce n'est pas la même chose : tu ne déclares pas une valeur constante comme quand tu écris "coucou". Tu dis qu'une variable ne peut pas changer.
    Le 1er concept, "valeur constante" existe dans tous les langages.
    Le 2nd, variable qui ne peut pas changer n'existe pas dans certains langages (historiquement en C) et dans d'autres, c'est la seule possibilité.

  9. #8
    cosmoff

    Re : langage C : probleme avec le caractere '\0'

    ok merci beaucoup pour toutes tes informations

  10. #9
    PA5CAL

    Re : langage C : probleme avec le caractere '\0'

    Citation Envoyé par cosmoff Voir le message
    Ca reste subtil que char *str = "coucou" est déclaré comme une constante et char str[] = "coucou" n'est pas une constante.
    Il n'y a pas de subtilité. Il faut juste bien distinguer la déclaration du type de la variable avec l'initialisation de cette variable, et utiliser le type de variable conforme à ce qu'on souhaite faire. En l'occurrence, un tableau est conçu pour contenir des éléments, tandis qu'un pointeur est conçu pour contenir une adresse en mémoire.

    Ainsi :
    - Dans le second cas on déclare un tableau, qui n'est pas constant puisqu'on peut modifier son contenu. Il contient initialement les sept caractères « coucou\0 », et pourra ensuite contenir sept autres caractères.
    - Dans le premier cas on déclare un pointeur, qui n'est pas non plus constant puisqu'on peut modifier son contenu. Il contient initialement l'adresse du tableau de caractères "coucou", et pourra ensuite contenir l'adresse d'un autre tableau de caractères, ou bien NULL.
    Dernière modification par PA5CAL ; 13/03/2019 à 11h08.

  11. #10
    Fustigator

    Re : langage C : probleme avec le caractere '\0'

    Citation Envoyé par cosmoff Voir le message
    ah ok je ne savais pas.

    Ca reste subtil que char *str = "coucou" est déclaré comme une constante et char str[] = "coucou" n'est pas une constante
    char *str = "coucou" fournit un pointeur (variable) sur une constante.
    char str[] = "coucou" alloue un tableau (variable) et l'initialise à partir du contenu d'une constante.

    Dans le premier "str" pointe sur une constante.
    Dans le deuxième "str" pointe sur le tableau str[] (qui lui est modifiable).

    Dans les deux cas str est un pointeur, mais pas sur le même "type" de mémoire.
    Dernière modification par Fustigator ; 13/03/2019 à 11h36.

  12. #11
    PA5CAL

    Re : langage C : probleme avec le caractere '\0'

    Citation Envoyé par Fustigator Voir le message
    Dans les deux cas str est un pointeur, mais pas sur le même "type" de mémoire.
    Pas dans le sens où un pointeur est une variable contenant une adresse.

    Il s'agit dans le deux cas d'une adresse sur le début d'un tableau en mémoire. La différence, c'est que:
    - dans le cas de char str[] cette adresse est connue* du programme, mais elle n'est stockée dans aucune variable.
    - dans le cas de char *str cette adresse est contenue dans le pointer. Ce que connaît* le programme, c'est l'adresse du pointeur, et non pas directement celle du tableau pointé.

    * : s'agissant d'une variable locale stockée sur la pile, cette adresse est généralement calculée par le programme à partir d'un pointeur de pile (SP, BP, ...) et d'un déplacement constant spécifique à la fonction et fourni par le code généré à la compilation. Sur les petits systèmes, les variables de petite taille peuvent rester dans les registres de l'UC.
    Dernière modification par PA5CAL ; 13/03/2019 à 13h30.

Discussions similaires

  1. problème avec le langage c
    Par invite7fe20698 dans le forum Programmation et langages, Algorithmique
    Réponses: 31
    Dernier message: 22/10/2018, 08h20
  2. [Programmation] langage c ==> problème avec while
    Par michelcreuse dans le forum Électronique
    Réponses: 6
    Dernier message: 31/01/2018, 17h48
  3. chercher une chaine de caractère dans un texte en Langage C
    Par invitee5fedd72 dans le forum Programmation et langages, Algorithmique
    Réponses: 17
    Dernier message: 10/12/2010, 00h01
  4. problème,transmission de caractère ascii avec l'hyperterminal
    Par invite323fcc0d dans le forum Électronique
    Réponses: 7
    Dernier message: 20/04/2010, 10h56
  5. problème avec langage C++
    Par invite0f6e0be6 dans le forum Logiciel - Software - Open Source
    Réponses: 5
    Dernier message: 03/10/2007, 11h20