2009-04-16 481 views
0

由於我對分配指針的類型內存的理解不夠,下面的調用barrier_create會導致總線錯誤(「hi」從不打印)。C malloc通過函數調用指針導致總線錯誤

typedef struct barrier barrier_t; 
typedef struct barrier *barrier_p; 

barrier_p test_barrier_p; 

int main(int argc, char *argv[]) { 
    barrier_create(*test_barrier_p); 
} 

int barrier_create(barrier_p *barrier_pointer) { 
printf("hi\n"); 
    barrier_p old_barrier, new_barrier; 
    int count; 
    old_barrier = (barrier_p) *barrier_pointer; 
    new_barrier = (barrier_p) malloc(sizeof(*new_barrier)); 
    count = pthread_mutex_init(&new_barrier->lock, NULL); 
    new_barrier->is_valid = VALID_BARRIER; 
    new_barrier->counter = 0; 
    new_barrier->release_flag = 0; 
    *barrier_pointer = new_barrier; 
    return HAPPY_HAPPY_JOY_JOY; 
} 

我錯過了什麼或錯誤輸入?

+2

作爲一個小挑逗:你通常不會「分配指針」。您分配存儲空間或內存,然後獲得指向該內存的指針。 – unwind 2009-04-16 07:55:26

+0

謝謝放鬆。這是一個有用的排名,我轉換了我的措辭以反映我的理解。 – Noel 2009-04-16 13:12:56

+1

這不是你的問題的答案,但一般來說你可能應該避免做像`typedef struct barrier * barrier_p`這樣的東西。只需使用'barrier_t *`。從長遠來看,它會減少混淆,'const barrier_t *`和`const barrier_p`不會是一回事。 – jamesdlin 2010-01-17 20:00:30

回答

7
barrier_create(*test_barrier_p); 

由於barrier_create需要barrier_p的地址,這應該是&test_barrier_p,不*test_barrier_p

printf("hi\n"); 

代碼可達性測試不準確,因爲標準輸出可能被緩衝;我建議使用fprintf(stderr, "hi\n");

new_barrier = (barrier_p) malloc(sizeof(*new_barrier)); 

我會說sizeof(barrier_t)。在奇怪的地方再次出現*_p表示法可能不會幫助您的類型操作更清晰。

對於迂腐,我會檢查malloc的返回值。除非以某種方式從malloc錯誤中恢復,否則我認爲保持舊值的意義不大。

伯爵的目的是什麼?

0

test_barrier_p變量是一個指向barrier結構的指針,它永遠不會被初始化,所以它被設置爲NULL(因爲它在文件範圍內)。

您正在從main()barrier_create()的電話中取消參考。

除此之外的幫助,您需要用英語告訴我們您要達到的目標。

7

您在您的主函數中取消了一個糟糕的指針。要獲取變量的地址,請使用地址&運算符,而不要使用取消引用*運算符。重寫主要爲:

barrier_create(&test_barrier_p); 
0

函數int barrier_create(barrier_p *barrier_pointer)將指針作爲參數。但是,由於您取消引用了barrier_create(*test_barrier_p),因此您在主文件中傳入了actual barrier_p。我認爲你應該通過地址barrier_create(&test_barrier_p)