2013-06-29 209 views
2

我被困在一個簡單的指針鑄造問題傳遞結構的數組:C,鑄造通過/空指針

我嘗試通過作爲參數傳遞給並行線程功能中的2層結構在pthread_create的陣列。下面是代碼:

struct sockaddr_in addr_left, addr_right; 
struct sockaddr_in* addr_vec [2] = {&addr_left, &addr_right}; 
pthread_create (&thread_forward, NULL, thread_func_forward, (struct sockaddr**)addr_vec); 

內thread_func_forward:

void * thread_func_forward (void * argv) { 
    struct sockaddr_in* addr_left = ((struct sockaddr_in*)argv + 0); 
    struct sockaddr_in* addr_right = ((struct sockaddr_in*)argv + 1); 
} 

出於某種原因,不能正常工作,該程序可以執行最後一個行不分段錯誤,但是當我訪問的成員結構完全改變

+1

我想'addr_left','addr_right'和數組是函數的局部變量,它們在堆棧上。當你返回形式這個函數時,這些堆棧變量不見了/ garbaged。 –

+1

你有沒有嘗試一次正常的函數調用,而不是線程?它工作正常嗎? – VoidPointer

回答

3

您不會將您的線程參數轉換回正確的類型。您的代碼將線程參數轉換爲struct sockaddr_in *,但這不是正確的類型。 addr_vec是一個指針數組,因此addr_vec會衰減成一個指向指針的指針。

由於您傳遞的是指向指針的指針,所以您應該在您的線程函數中將其轉換爲此類指針。然後,您需要取消引用它以獲取所需的指針。

struct sockaddr_in* addr_left = *((struct sockaddr_in**)argv + 0); 
    struct sockaddr_in* addr_right = *((struct sockaddr_in**)argv + 1); 

事實上,那些從創建線程的函數指向本地自動變量的指針可能是也可能不是問題。它取決於該函數是否在這些變量超出範圍之前等待線程完成。

+0

它是有道理的,現在它正在工作。非常感謝。 –

+0

非常歡迎。 – jxh

1

您的addr_vec住在自動存儲器中(即在堆棧中),但沒有跡象表明您已採取任何措施來確保變量的使用壽命至少持續至少達到點你可以在線程中訪問它們。

總之,您需要在創建線程之前動態分配,然後在線程中釋放它,或者使用同步原語來阻止在創建線程之前創建線程的函數返回之前, 。