2009-10-19 11 views
1

je le code suivant:C: Problème avec des tableaux Jagged

int *edges[500]; 
char arr[] = {'c','d'}; 
edges[0] = arr; 
printf("%c - %c", edges[0][0],edges[0][1]); 

Ce que je veux afficher est c - d mais ce qui est réellement affiché est c -
Comme vous pouvez le voir ci-dessus, le premier élément est d'être affiché mais pas le second.

Pourquoi le deuxième élément du tableau n'est-il pas affiché?

+0

Êtes-vous sûr que le '-' devrait être là? – Jacob

+0

@Jacob finit par être là car 'edges [0] [0]' et 'edges [0] [1]' finissent par accéder à de la mémoire non initialisée. Sur mon ordinateur, le programme affiche «c» ' –

+0

Droite, gotcha Mais ne devrait pas l'OP« veulent afficher »,« cd »et pas« c - d »? – Jacob

Répondre

7

Depuis un int et char ont des tailles différentes, vous devriez essayer char *edges[500]

+0

Excellent, c'était le problème –

2

Eh bien, le message

 
t.c:6: warning: assignment from incompatible pointer type 

pourrait avoir quelque chose à voir avec elle. En C, 'c' est un (petit) entier. Vous stockez les char s dans arr. Cependant, en accédant arr comme edges[0] qui est un int *, vous récupérez réellement (sur la plupart des plates-formes) arr[0], arr[1], arr[2] et arr[3] comme nombre entier.

3

Incompatibilité de type. edges est un tableau de 500 pointeurs vers int et vous attribuez un pointeur à deux caractères à son premier élément.

2

edges[0] est interprété comme un tableau int avec des éléments {(int) 'cd', 0} (en fait, le second élément peut contenir n'importe quel indésirable). Printf avec le spécificateur% c prend le premier octet de edges[0][0] (c'est-à-dire 'c') et le premier octet de edges[0][1] (qui s'est avéré être 0).

changez le type de edges en char* edgeds[500].

0

edges est un tableau de pointeurs vers int. L'expression edges[0] renvoie un pointeur vers int, pas de pointeur sur char. Le traiter comme un tableau char provoque le calcul du décalage d'octet erroné, provoquant l'affichage de la valeur d'un morceau inattendu de mémoire plutôt que la mémoire contenant la valeur de char 'd'.

décalages Array calculent le décalage en octets en fonction de la taille du type pointé:

foo_t * x; 
ptrdiff_t difference = x[1] - x[0]; 

La valeur de difference sera sizeof(foo_t) octets. sizeof(char) est défini sur 1, et sizeof(int) est généralement 4, ce qui signifie que votre code va déréférencer une valeur de 4 octets dans le tableau char, pas 1 octet dans le tableau char.

2

ligne 3

edges[0] = arr; 

types incompatibles dans l'affectation: arr est un char * et edges[0] est un int *.

Ce qui se produit est la suivante:

int *edges[500]; 
char arr[] = {'c','d'}; 

arr [0] est 'c' et arr [1] est 'd'

edges[0] = arr; 

Ignorer la compatibilité des types, des bords [0 ] pointez sur le int à l'adresse où les 'c' et 'd' (et éventuellement deux autres caractères non spécifiés) sont.

printf("%c %c", edges[0][0],edges[0][1]); 

bords [0] [0] est le premier entier dans des bords [0] qui est le mélange de 'c', 'd' (et, éventuellement, deux caractères plus non spécifiés). Cette valeur est convertie en caractère non signé, ce qui donne 'c' qui est imprimé.
bords [0] [1] pointe vers l'entier juste après le mélange de 'c', 'd' (et éventuellement deux autres caractères non spécifiés). Cet emplacement de mémoire n'a pas été initialisé et il se peut qu'il soit hors de portée de votre processus.

si vous imprimez un int au lieu de 2 caractères

printf("%d\n", edges[0][0]); 

vous verrez le mélange de 'c', 'd' (et peut-être deux caractères non spécifiés).

La meilleure chose à faire est de bien vous entendre.

+0

+1 pour l'explication –