2013-03-25 15 views
6

Mam funkcję, podstawową ideą funkcji jest zmiana tego, co wskazuje a. Pierwsza wersja działa, ale druga wersja nie.Anomalia wskaźnika C, proszę wytłumaczyć

Czy ktoś mógłby mi pomóc zrozumieć, co się tutaj dzieje?

// 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; 
} 

Wołam funkcję jak tak

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

    swap(&a); 

    return 0; 
} 

Ponadto, obie funkcje nie należą do tego samego pliku w tym samym czasie.

+0

Robisz coś bardzo złego w drugiej funkcji. – wRAR

+0

Po co nazywać nową zmienną o tej samej nazwie paramatera? –

+0

Ponowne deklarowanie tablicy int w drugiej funkcji wymiany było niedopatrzenie podczas publikowania tutaj. Usunąłem to z pytania. – robbmj

Odpowiedz

14

Priorytet [] jest wyższy niż * (w rzeczywistości [] ma najwyższy priorytet w C). Oznacza to, że Twoja ekspresja ma wartość *(a[0]), a nie (*a)[0].

+0

Nie jestem pewien, czy '(* a) [0]' było zamierzone, ponieważ '* a' nie jest indeksowalne. – wRAR

+0

Dzięki Ben, to się udało, również dzięki za zawarte wyjaśnienie. – robbmj