2016-01-16 148 views
2

我正在創建一個線程並將指針傳遞給它。 但是,當我投這個指針,因爲它應該是一個(int *)我有一個分段錯誤。C - pthread分段錯誤11

int *ptr = (int *)ptrTotal2; 

下面是代碼:

void *firstCalc(void *ptrTotal2){ 
    int valA = 1; 
    int valB = 2; 
    int *ptr = (int *)ptrTotal2; 
    *ptr = valA + valB; 
    printf("Value of valA = %d\nValue of valB = %d\n", valA, valB); 
    printf("Value of subtotal *ptrTotal1 = %d\n", *ptr); 
    pthread_exit(NULL); 
} 

int main(int argc, char **argv) { 

    pthread_t thread1; 
    int *ptrTotal2 = 0; 
    int iret1; 

    iret1 = pthread_create(&thread1, NULL, firstCalc, (void*) ptrTotal2); 
    if(iret1){ 
    fprintf(stderr,"Error - pthread_create() return code: %d\n",iret1); 
    exit(EXIT_FAILURE); 
    } 

    pthread_join(thread1, NULL); 

    exit(EXIT_SUCCESS); 

} 

回答

1

在函數firstCalc中提取ptr,當原始指針設置爲0時,會導致未定義的行爲,在您的情況下會出現分段錯誤。

int *ptr = (int *)ptrTotal2; 
*ptr = valA + valB; 
... 
int *ptrTotal2 = 0; 

而是分配內存的一個整數,並把它傳遞到創建的線程,並釋放它的線程結束後:

int *ptrTotal2 = malloc(sizeof(int)); 
if(!ptrTotal2) 
{ 
    abort(); 
} 

//... call pthread_create, pthread_join 

free(ptrTotal2); 

請注意,您必須使用分配的內存(使用malloc) ,因爲從不同線程讀取自動變量是實現定義的。對象的

6.2.4存儲持續時間

  • 試圖間接地與自動存儲持續時間從一個比其它一個 線程訪問的對象的 結果與該對象關聯的是實現定義的。
  • +1

    感謝它幫助了很多;) –

    0

    您ARA廢棄一個NULL指針,引起分段錯誤,因爲它是不確定的行爲。

    試試這個

    int value = 0; 
    int *ptrTotal2 = &value; 
    

    ,並請保持pthread_join(thread1, NULL);value將被釋放,並再次未定義的行爲

    +0

    感謝您的評論! –

    0

    你沒有得到段錯誤而分配指針,你說對了,因爲你試圖取消引用指針,這是空,在稍後的點。

    在你main(),你寫

    int *ptrTotal2 = 0; 
    

    這是基本上一樣

    int *ptrTotal2 = NULL; 
    

    現在,線程函數裏面,你在做

    *ptr = valA + valB; 
    

    這是試圖取消引用NULL指針。這調用undefined behavior。分段故障是UB的副作用之一。

    什麼,你可以嘗試做的是

    • 使ptrTotal2int,像int ptrTotal2 = 0;
    • 通過它的地址,像iret1 = pthread_create(&thread1, NULL, firstCalc, &ptrTotal2);
    +0

    umm。這裏有什麼錯誤? –

    +0

    感謝您評論它的作品! –

    0

    您可以嘗試printfptr指針的值。這是一個NULL指針,因爲ptrTotal2也是一個NULL指針。然後在下面的表達式

    *ptr = valA + valB; 
    

    *ptr試圖從中ptr指出,不幸的是,ptr點爲NULL地址解引用,所以段發生故障。