2013-03-25 33 views
6

Bir işleve sahibim, fonksiyonun temel fikri, a'un işaret ettiği noktaları değiştirmektir. İlk versiyon çalışır ancak ikinci versiyonda yoktur.C işaretçisi anomalisi, lütfen açıkla

Birisi burada neler olup bittiğini anlamak için bana yardımcı olabilir mi?

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

Ben

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

    swap(&a); 

    return 0; 
} 

Ayrıca her iki fonksiyonu aynı anda aynı dosyaya ait olmayan şöyle işlevini arıyorum.

+0

İkinci işlevde çok yanlış bir şeyler yapıyorsunuz. – wRAR

+0

Neden paramater aynı ada sahip yeni bir değişken adlandırma? Ikinci takas işlevinde int dizisi bildiren –

+0

yeniden burada gönderme yaparken bir gözetim oldu. Onu sorudan kaldırdım. – robbmj

cevap

14

[]'un önceliği *'dan daha yüksektir (aslında, [], C'deki en yüksek önceliğe sahiptir). Bunun anlamı, ifade ettiğin gibi (*a)[0] yerine *(a[0]).

+0

Emin değilim (* a) [0] ', 'a' abonelik değildir. – wRAR

+0

Teşekkürler Ben, bu hile yaptı, ayrıca dahil açıklama için teşekkürler. – robbmj

İlgili konular