C: Problema con Jagged Array
-
22-09-2019 - |
Domanda
Ho il seguente codice:
int *edges[500];
char arr[] = {'c','d'};
edges[0] = arr;
printf("%c - %c", edges[0][0],edges[0][1]);
Quello che voglio visualizzata è c - d
ma ciò che viene effettivamente visualizzato è
c -
Quindi, come potete vedere sopra, il primo elemento viene visualizzato, ma non il secondo.
Perché non è il secondo elemento della matrice non essere visualizzata?
Soluzione
Dal momento che un int
e char
hanno dimensioni diverse, si dovrebbe cercare char *edges[500]
Altri suggerimenti
Tipo non corrispondente. edges
è un array di 500 puntatori a int e si stanno assegnando un puntatore a due personaggi al suo primo elemento.
Bene, il
t.c:6: warning: assignment from incompatible pointer type
messaggio potrebbe avere qualcosa a che fare con esso.
In C, 'c'
è un (piccolo) numero intero. Di memorizzare quelli come char
s in arr
. Tuttavia, accedendo arr
come edges[0]
che è un int *
, in realtà si sta recuperando (sulla maggior parte delle piattaforme) arr[0]
, arr[1]
, arr[2]
e arr[3]
come numero intero.
edges[0]
viene interpretato come int array con elementi {(int) 'cd', 0} (in realtà, il secondo elemento può contenere qualsiasi indesiderata).
printf con specificatore% c prende primo byte di edges[0][0]
(cioè 'c') e il primo byte del edges[0][1]
(che per caso 0).
Cambia tipo di edges
a char* edgeds[500]
.
linea 3
edges[0] = arr;
tipi incompatibili in assegnazione:. arr
è un char *
e edges[0]
è un int *
Quello che succede è questo :
int *edges[500];
char arr[] = {'c','d'};
arr [0] è 'c' e arr [1] è 'd'
edges[0] = arr;
Ignorando la compatibilità tipo, bordi [0] indicano il int
all'indirizzo dove il 'c' e 'd' (e possibilmente due caratteri più non specificato) sono.
printf("%c %c", edges[0][0],edges[0][1]);
bordi [0] [0] è il primo numero intero bordi [0]: questo è il mix di 'c', 'd' (ed eventuali due caratteri più non specificati). Tale valore viene convertito in unsigned char, cedendo 'c' che viene stampato.
bordi [0] [1] indica il numero intero subito dopo il mix di 'c', 'd' (e possibilmente due caratteri più non specificati). Che posizione di memoria non è stata inizializzata e può ben essere al di fuori della gamma il processo può accedere.
Se si stampa un int invece di 2 caratteri
printf("%d\n", edges[0][0]);
si vedrà il mix di 'c', 'd' (e, eventualmente, due caratteri non specificati).
La cosa migliore da fare è ottenere i tipi di destra.
edges
è un array di puntatori a int. Il edges[0]
espressione produce un puntatore a int, non puntatore a char. Trattandolo come un array di char determina l'offset da calcolare byte errato, provocando il valore di un pezzo inaspettata di memoria da visualizzare anziché sulla memoria che tiene il valore char 'd'.
offset Array calcolare l'offset in byte in base alle dimensioni del tipo indicate a:
foo_t * x;
ptrdiff_t difference = x[1] - x[0];
Il valore di difference
sarà byte sizeof(foo_t)
. sizeof(char)
è definito come 1, e sizeof(int)
è tipicamente 4, il che significa che il codice sarà dereferenziazione un valore 4 byte nella matrice char, non 1 byte nell'array char.