2012-06-28 136 views
1

我的程序包含以下代碼。pthread_create導致分段錯誤

pthread_t PThreadTable[32]; 

for (i=1; i<P; i++) // Checked with P = 4 
    { 
     long i, Error; 

     printf("pthread_create %d!\n", i); 
     Error = pthread_create(&PThreadTable[i], NULL, 
      (void * (*)(void *))(SlaveStart), NULL); 
     if (Error != 0) 
     { 
      printf("Error in pthread_create().\n"); 
      exit(-1); 
     } 
    } 

SlaveStart(); 

代碼給出了主叫pthread_create(通過gdbvalgrind選中)段故障。爲什麼這樣?

+0

這通常會成爲程序中其他地方出現內存破壞的症狀。請發佈我們自己編譯並觀看崩潰的[最小工作示例](http://techblog.ironfroggy.com/2007/02/minimal-working-examples-how-to-why-and.html)。另外,請查看valgrind告訴你的*第一個*無效內存訪問權限 - 打賭你不在這裏。 – zwol

+0

這不是一個最小的工作示例,您可以創建一個裸機SlaveStart。 – pythonic

+0

你爲什麼要使用你的函數指針?如果它具有正確的類型,則不必這樣做。如果它有另一種類型,你會有一個段錯誤:) –

回答

8

它是因爲你在循環內部重新聲明變量i。循環內的變量正在使用,它包含垃圾值。這就是爲什麼表達&PThreadTable[i]指向一個錯誤的地址,你會得到分段錯誤。

+4

只是爲了拋出它,這就是爲什麼你應該總是用'-Wall'編譯器選項編譯,或者至少在初始代碼和/或調試時編譯。我以這種方式捕捉了一些奇怪的小物品,我想它也會解決這個問題。 – Will