ththththth
Messages postés10Date d'inscriptionvendredi 23 avril 2004StatutMembreDernière intervention 2 mars 2007
-
2 févr. 2007 à 18:13
SAKingdom
Messages postés3212Date d'inscriptionlundi 7 novembre 2005StatutMembreDernière intervention16 février 2009
-
2 févr. 2007 à 21:00
Bonjour à tous !!!
J'ai un petit probleme pour acceder aux éléments d'un unsigned char**.
Un pti bout de code sera plus simple...
unsigned char **t = (unsigned char **)malloc(sizeof(unsigned char*)* 10*10);
int q, p;
for(q = 0; q < 10; q++ )
{
for(p = 0; p < 10; p++ )
{
//et là : tout ce que j ai essayé
*t[q*10+p]=(unsigned char)255;
//ou
**(q*10+p)=(unsigned char)255;
//ou
t[q][p]=(unsigned char)255;
}
}
A chaque fois je tombe sur un SEG FAULT.
Je ne peux pas manipuler de tableau à deux dimensions car je ne connais pas les tailles à l'avance dans mon prog.
Voila. C'est surement pas grand chose mais bon ... si quelqu'un peut m'aider .. Merci d'avance.
cs_laurent1024
Messages postés987Date d'inscriptionmardi 31 mai 2005StatutMembreDernière intervention30 août 201225 2 févr. 2007 à 18:40
tu alloue un unsigned char**
donc quand tu fait t[q][p] ou t[q*10+p] l'élément correspondant est un pointeur sur un unsigned char. Ce pointeur n'est pas alloué donc c'est normal qu'il y est des plantages mémoire
acx01b
Messages postés280Date d'inscriptiondimanche 7 septembre 2003StatutMembreDernière intervention 8 juillet 20146 2 févr. 2007 à 20:30
salut
le problème c'est: un pointeur ce n'est pas un tableau, l'opérateur [] c'est le même opérateur que * mais dont la syntaxe est différente
après avoir alloué une zone mémoire avec malloc, quand tu fais
t[q][p] , en fait tu fais (t[q])[p]:
c'est à dire unsigned char* x = t[q]
et ensuite x[p]
seulement x=t[q] a une valeur indéterminée, qui pointe vers on ne sait où
ou pire ce x peut valoir 0
en faisant x[p] si x = 0 ça veut dire que tu essayes de lire ce qu'il y a à l'adresse 0 ... voilà la raison du seg fault
il faudrait que tu fasse
int i = 10;
for (i=0; i < 10; i++) t[i] = malloc(sizeof * t[i] * 10);
// sizeof *t[i] <=> sizeof (unsigned char) dans ton cas
// c a dire que *t[i] est un unsigned char
enfin regarde ce que donne
char x[5][5];
printf("%p %p %p %p %p %p", x, &x, x[0], &x[0], &x[0][0], x[0][0]);
SAKingdom
Messages postés3212Date d'inscriptionlundi 7 novembre 2005StatutMembreDernière intervention16 février 200915 2 févr. 2007 à 21:00
Allocateur pour pointeur de pointeurs à cette adresse Très simple d'utilisation et beaucoup plus performant qu'allouer la mémoire pour chaque pointeur séparément.