[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
Re: [linux] [devel] Petit soucis avec C.
Le 2001.07.01 10:45, CHARLIER Philippe a écrit :
> 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 ???
C'est parce que tu essayes d'écrire a une adresse qui est protégée,
*(p_char + 2) renvoye 99 (la valeur décimale de 'c'), donc tu essaye
d'écrire a l'adresse 99 de ta mémoire qui est surement utilisé par le noyau
linux. Si je me goures, qqun me corrigera surement.
Cedric.
[ 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 ]