2013-03-25 19 views
6

Ho una funzione, l'idea di base della funzione è quella di cambiare a a punti. La prima versione funziona comunque la seconda versione no.anomalia puntatore C, si prega di spiegare

Qualcuno potrebbe aiutarmi a capire cosa sta succedendo qui?

// this works 
void swap(int **a) { 
    int *temp = malloc(sizeof(int) * 3); 
    temp[0] = 0; 
    temp[1] = 1; 
    temp[2] = 2; 
    *a = temp; 
} 

// this does not 
void swap(int **a) { 
    *a = malloc(sizeof(int) * 3); 
    *a[0] = 0; 
    *a[1] = 1; // seg fault occurs on this line 
    *a[2] = 2; 
} 

sto chiamando la funzione in questo modo

int main() { 
    int b[] = {0,1}; 
    int *a = b; 

    swap(&a); 

    return 0; 
} 

Inoltre, entrambe le funzioni non appartengono allo stesso file nello stesso momento.

+0

Si sta facendo qualcosa di molto sbagliato nella seconda funzione. – wRAR

+0

Perché nominare una nuova variabile con lo stesso nome del parametro? –

+0

re dichiarare che l'array int nella seconda funzione di scambio era una svista quando si postava qui. L'ho rimosso dalla domanda. – robbmj

risposta

14

La precedenza di [] è superiore a * (infatti, [] ha la precedenza più alta in C). Ciò significa che la tua espressione è *(a[0]) anziché (*a)[0] come previsto.

+0

Non sono sicuro che '(* a) [0]' era inteso, dato che '* a' non è indicativo. – wRAR

+0

Grazie Ben, questo ha fatto il trucco, anche grazie per la spiegazione inclusa. – robbmj

Problemi correlati