2013-02-19 5 views
0

donné le code suivantpointeur déréférencement à un pointeur

#include <stdlib.h> 
#include <stdio.h> 
typedef struct Foo { 
    int **bar; 
}Foo; 


int main(){ 
    Foo *foo = malloc(sizeof(Foo)); 
    foo->bar = malloc(sizeof(int**)); 
    int *tmp = malloc(sizeof(int)*2); 
    tmp[0]= 0; 
    tmp[1]=1; 
    *(foo->bar) = tmp; 
    //printf("%d",*(foo->bar)[1]); <=== This line                                             
    int *tmp2 = *(foo->bar); 
    printf("%d ",tmp2[1]); 

    return 0; 
} 

La ligne commentée provoque une erreur de segmentation. Est-ce que quelqu'un peut expliquer ce qui se passe réellement?

Pourquoi cette ligne et l'instruction d'impression suivante ne sont-elles pas équivalentes?

Merci

Répondre

6

> Can some one please explain what is actually happening?

C'est un problème operation precedence:

printf("%d",(*(foo->bar))[1]); // <=== This is what you wanted 

Notez les parens supplémentaires groupant la déférence du foo->bar avant la [1], vous devez le faire parce que le subscripting ([] L'opérateur a une priorité plus élevée que l'opérateur de déréférencement (*)

> Why is that line and the next print statement not equivalent?

Car en brisant les déclarations que vous avez pris soin de l'ordre d'émission des opérations, vous avez fait l'opération de priorité inférieure se produit d'abord:

int *tmp2 = *(foo->bar); 
2

L'opérateur d'indexation de tableau [] a une priorité plus élevée que l'opérateur de déférence *. Ainsi, cette ligne signifie "déférence le int * à l'index 1 du tableau foo->bar". Mais bien sûr, vous n'avez qu'un tableau de 1 int * (index 0), ce qui entraîne une erreur de segmentation.

Questions connexes