[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
Re: [linux] [devel] Petit soucis avec C.
Si tu vas sur le newsgroup fr.comp.lang.c, dans la faq il explique que la seconde
écriture est fautive mais accepté sur certains compilos, qui réservera la mémoire
pour la chaîne. La première tu déclares un tableau que tu remplis directement, la
seconde tu déclares un pointeur. Je ne fais que répéter pas la peine de jouer aux
trolls:-)
CHARLIER Philippe wrote:
> Le Dimanche 1 Juillet 2001 09:31, Cedric De Wilde a écrit :
> > Le 2001.07.01 08:49, CHARLIER Philippe a écrit :
> > > Le Dimanche 1 Juillet 2001 00:09, Cedric De Wilde a écrit :
> > > > Chez moi, il ne met pas "Abandon".
> > > > Etant aussi en train d'apprendre le C, j'ai une question a te poser.
> > >
> > > Quand
> > >
> > > > tu déclare "char **p_char;" est ce que ca ne serait pas plus logique de
> > > > faire "char *p_char[3]" comme ca le systeme déclarerais 3 pointeurs sur
> > > > tableau de caractere, avec ta déclaration, tu ne fait que déclarer un
> > > > pointeur sur pointeur. D'apres ma logique(mais bon,j'ai peut etre rien
> > > > compris), ca ne te permet pas d'utiliser p_char + 1 et p_char + 2 comme
> > >
> > > tu
> > >
> > > > le fait sans écrire dans une zone qui ne sont normalement pas
> > >
> > > accessible
> > >
> > > > par ce moyen.
> > >
> > > Normalement les notations
> > > char **p_char et char *p_char[] sont equivalentes car le nom d'un
> > > tableau est un pointeur sur son premier element.
> > > Donc :
> > > t[i] est equivalent a *(t+i).
> >
> > Oui, mais ce n'est pas ca que je voulais dire, je comprends les 2
> > notations.
> > J'essaie de réexpliquer. Au début, tu déclare un pointeur(p_char) sur
> > pointeur donc tu réserves 4 bytes qui serviront pour stocker une adresse,
> > alors que apres, tu utlises les adresses mémoires qui sont apres l'adressse
> > de p_char. Comment le systeme sait il que tu as besoin de 3 pointeur plus
> > loin?
>
> Mince,
>
> Effectivement c'est cela. J'ai un profond probleme de comprehension de la
> notion d'espace memoire reserve lors d'une declaration :-(
>
> Si on fait :
>
> #include <stdio.h>
>
> int main (int argc, char **argv)
> {
> char *p_char[3] = {"Bonjour", "Hello", "Goeiedag"};
> int i;
>
> for ( i=0; i <= 2; i++)
> printf("Affichage de *(pchar+%d) : %s.\n", i, *(p_char + i) );
>
> printf("test.\n");
>
> return 0;
> }
>
> Alors ca marche car cette fois-ci on reserve 3 pointeurs.
>
> Par contre il me reste les soucis suivants :
>
> 1. Pourquoi mon programme precedent, qui etait visiblement faux, me sortait
> un "Abandon" au lieu de "Segmentation Fault" ???
>
> 2. Quand on declare une chaine de caractere comme suit :
>
> #include <stdio.h>
>
> int main (int argc, char **argv)
> {
> char p_char[] = "Ceci est un test";
>
> *(p_char + 2) = 'l';
> *(p_char + 3) = 'a';
>
> printf("%s.\n", p_char );
>
> printf("test.\n");
>
> return 0;
> }
>
> Ca marche, par contre, comme suit :
>
> #include <stdio.h>
>
> int main (int argc, char **argv)
> {
> *p_char = "Ceci est un test";
>
> *(p_char + 2) = 'l';
> *(p_char + 3) = 'a';
>
> printf("%s.\n", p_char );
>
> printf("test.\n");
>
> return 0;
> }
>
> Donne une Segmentation Fault ???
>
> Philippe
>
> > > D'apres le peu que j'ai compris, le programme est correct ... Mais il
> > > faut
> > > que j'en apprenne plus pour trouver la source du probleme ;-)
> >
> > Tu saurais me tenir au courant , ca m'interresse aussi.
> >
> > > Philippe
>
> [ Soyez précis dans vos sujets svp afin de déterminer directement ]
> [ le type de demande... ]
> [ Pour vous (dés)inscrire, aller sur http://linuxbe.org/ml.php ]
> [ http://LinuxBe.org Contact: listmaster@linuxbe.org ]
[ Soyez précis dans vos sujets svp afin de déterminer directement ]
[ le type de demande... ]
[ Pour vous (dés)inscrire, aller sur http://linuxbe.org/ml.php ]
[ http://LinuxBe.org Contact: listmaster@linuxbe.org ]