[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
Re: [linux] [devel] Petit soucis avec C.
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 ]