J'essaie d'accéder à un tableau de chaînes via des pointeurs. Cela semble fonctionner correctement quand la mémoire est alocated mais d'une façon ou d'une autre les valeurs sont perdues si j'essaye d'itérer encore le pointeur. Cependant, les adresses pointées sont correctes.C Pointer to Pointer - Liste des chaînes d'accès
char **rows = (char **) malloc(sizeof(char) * 8);
int i;
for (i = 0; i < 5; i++) { //first time
*(rows + i) = malloc(sizeof(char) * 8);
sprintf(*(rows + i), "0x10%d", i);
printf("---%[email protected]%x", *(rows + i), (rows + i));
}
for (i = 0; i < 5; i++) { //second time
printf("++++%[email protected]%x", *(rows + i), (rows + i));
}
Format de sortie: valeur adresse @
Au-dessus (première boucle) produira la sortie suivante:
[email protected]
[email protected]
[email protected]
[email protected]
[email protected]
Ce qui est correct interms des valeurs et des adresses correspondantes. Mais en quelque sorte les valeurs sont perdues lorsque je tente de les utiliser à nouveau, ci-dessous est la sortie de la deuxième boucle:
[email protected]
[email protected]
[email protected]
[email protected]
[email protected]
Comme sa plaine pour voir cette adresse sont corrects pour les cinq nœuds, mais les valeurs pour les noeuds de départ sont manquantes .
Question:
Pourquoi les valeurs sont manquantes à l'adresse 0x1007e0 et 0x1007e8 avec adresse valide?
Merci,
Je me demande si vous vouliez vraiment dire: 'char ** rows = (char **) malloc (sizeof (char *) * 8);' - allouer 8 pointeurs char, plutôt que 8 caractères. – mah
#mah Merci et c'était le problème. Je me demande comment se fait-il encore qu'il montre des valeurs! Des pensées à ce sujet? – ila
@ user2492889 C'est un comportement indéfini: le crash ou les écrasements n'ont pas besoin de se produire, votre programme aurait pu fonctionner jusqu'au bout, si malloc était un peu plus généreux pour allouer de la mémoire supplémentaire au delà de ce que vous avez demandé. – dasblinkenlight