2013-06-17 1 views
2

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,

+7

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

+0

#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

+0

@ 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

Répondre

2

Je pense que cela peut avoir à faire avec votre code ne pas allouer suffisamment d'espace pour les pointeurs: puisque vous allouez huit pointeurs, pas huit caractères, cette ligne

char **rows = (char **) malloc(sizeof(char) * 8); 

devrait être

char **rows = malloc(sizeof(char*) * 8); 

Cette modification corrige le problème (demo on ideone).

+0

Que diriez-vous de 'char ** rows = malloc (sizeof (void *) * 8);'. Aucun retour de malloc ne revient, et je préfère personnellement "void *" juste parce qu'il est facile de distinguer la taille du pointeur auquel on se réfère. – Jite

+1

@jite ma préférence pour la taille serait en fait 'malloc (sizeof (* rows));' - c'est un schéma général que je suis pour permettre à un changement de type d'une variable de ne pas interférer avec les allocations (bien un type de pointeur à un autre n'est pas un changement de taille). – mah

+0

@Jite C'est vrai, c'est C, pas C++, donc il n'y a pas besoin de lancer. J'ai copié-collé à partir de l'OP, donc j'ai gardé le casting, mais ce n'est en effet pas nécessaire. – dasblinkenlight