2017-10-17 87 views
0

我試圖遵循幾個答案/ tuturials的程序,並且我仍然在將多個參數傳遞給線程時出現分段錯誤?我究竟做錯了什麼?如何將多個參數傳遞給c中的線程? [Segmentation fault]

結構:

struct client_struct { 
    int socketId; 
    char *message; 
}; 

處理功能:

// Handle socket session 
void *process(void *client) 
{ 
    client_struct *tmpClient = (client_struct*)client; 
    char sendline[BUFFSIZE], recvline[BUFFSIZE]; 
    printf("can't reach this: %i\n", tmpClient->socketId); 
    strncpy(sendline, tmpClient->message, sizeof(sendline)-1); 
    sendline[sizeof(sendline)-1] = '\0'; 
} 

從主叫:

int sendMessage(const char *message, int sock) 
{ 
    int result; 
    pthread_t process_thread; 

    struct client_struct * client; 
    client->socketId = sock; 
    strcpy(client->message, message); 
    printf("segmentation fault here: %s\n", client->message); 

    pthread_create(&process_thread, NULL, process, client); 
    pthread_detach(process_thread); 
} 
+1

你有你的指針'client',但你似乎並沒有讓*點*地方?未初始化的局部變量將具有*不確定*值(這看起來幾乎是隨機的)。取消引用這樣的指針變量會導致[*未定義的行爲*](https://en.wikipedia.org/wiki/Undefined_behavior),並且是導致崩潰的一種常見方式。 –

+1

你可能忘了初始化'client':'struct client_struct * client = malloc(sizeof * client);' – usr

+0

然後在上面的那個之後,你繼續使用未初始化的指針,'client-> message'指向什麼?當你將該指針作爲「strcpy」調用的目的地時,你認爲會發生什麼? –

回答

1

與時未初始化指針未定義行爲經典問題。

struct client_struct * client; 

client = malloc(sizeof(*client)); //Allocate memory for client 
client->... = ...; //DO you job 

這樣做struct client_struct * client;你只聲明變量,它(可能在某個時候)指向struct client_struct類型的數據。由於您還沒有數據,因此解除引用未初始化的指針會導致未定義的行爲。

通過使用malloc,您正在設置指針的有效數據。

+0

該行給我以下內容 錯誤:從'void *'無效轉換爲'client_struct *'[-fpermissive] –

+1

看起來您不是C而是C++。使用'client =(struct client_struct *)malloc(sizeof(* client));' – tilz0R

+0

yh,就在你評論之前就做到了,它工作正常:p抱歉打擾你了,我也已經接受了你的awnser;) –

0

簡單proxyargs結構也可用於:

struct Args 
{ int a; float f; char msg[10]; }; 
... 
static void* callback(void* userData) 
{ 
Args* a = (Args*) userData; 
/* use args here */ 
} 
... 
Args mArgs = {10, 2.0, "message"}; 
pthread_create(&thread,NULL, callback, (Args*)&mArgs); 
enter code here