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?

È stato utile?

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 chars 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.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top