2010-09-29 4 views
0

gcc 4.4.4 C89Obtenir l'adresse d'un pointeur triple à carboniser

Je me demande pourquoi je reçois une autre adresse mémoire. Lorsque j'imprime l'adresse des animaux dans le principal, je reçois le texte suivant:

animals [ rabbit ] : [ 0xbfab2e48 ] 
animals [ rabbit ] : [ 0xbfab2e48 ] 

Cependant, lorsque j'imprime dans la fonction, je reçois différents emplacements de mémoire. Je pense qu'ils devraient être les mêmes.

ptr animals [ rabbit ] : [ 0xbfab2e08 ] 
ptr animals [ rabbit ] : [ 0xbfab2e08 ] 

Un grand merci pour tous les conseils,

int main(void) 
{ 
    char *animals[] = {"rabbit", "cat", "dog", "elephant", "racoon", NULL}; 
    char *countries[] = {"india", "amercia", "france", "spain", "canada", "mexico", NULL}; 
    char *cars[] = {"ford fista", "Masda 3", "honda city", "toyata cote", NULL}; 
    char **ptr_data[] = {animals, countries, cars, NULL}; 

    printf("animals [ %s ] : [ %p ]\n", *animals, (void*)animals); 
    printf("animals [ %s ] : [ %p ]\n", animals[0], &animals[0]); 

    print_data_ptr(ptr_data); 

    return 0; 
} 

void print_data_ptr(char ***ptr) 
{ 
    char **data_list = NULL; 

    printf("ptr animals [ %s ] : [ %p ]\n", *ptr[0], (void*)&ptr[0]); 
    printf("ptr animals [ %s ] : [ %p ]\n", **ptr, (void*)ptr); 
} 

Répondre

4

animals est un tableau de valeurs char * et ptr_data est un tableau de valeurs char **.

Lorsque vous initialisez ptr_data dans cette ligne:

char **ptr_data[] = {animals, countries, cars, NULL}; 

animals est évalué en tant que pointeur vers son premier élément - donc ptr_data[0] est le même que &animals[0] - l'adresse du premier char * dans animals. La même chose se produit dans vos deux printf() fonctions principales - animals et &animals[0] évaluent à la même chose, qui est également la valeur de pointeur stockée dans ptr_data[0].

Au sein de votre fonction, ptr est un pointeur vers le premier élément de ptr_data dans le principal - donc ptr est équivalent à &ptr_data[0]. &ptr[0] est complètement équivalent à ptr - donc &ptr[0] vous montre l'adresse de ptr_data[0], pas ce qui y est stocké. Si vous imprimez ptr[0] à la place, vous obtiendrez l'adresse de animals[0].