執行緒傳遞結構體引數(Segmentation fault (core dumped))
阿新 • • 發佈:2019-02-16
1. 執行緒傳遞結構體引數,
1)把定義的結構體換成指標名字 -->typedef
typedef struct list{
regp reg_head;
car_iop car_io_head;
char number[4];
}*listp;
2)用指標名字定義一個新的名字並申請記憶體--> listp list = malloc(sizeof(list));
3)在建立執行緒引數中把新名字強制轉換成(void *)--> pthread_create(&in, NULL, &car_in, (void *)list);
注意:執行緒傳遞 結構體 引數必須是指標型變數,然後再強制轉換成(void *)型變數
用指標名字定義變數時, 必須申請一塊與結構體大小相同的記憶體,不然編譯可以通過,但是執行會有段錯誤(Segmentation fault (core dumped))
#include <stdio.h> #include <stdlib.h> #include <unistd.h> #include <string.h> #include <pthread.h> typedefstruct reg{//註冊使用者結構體 char name[10];//使用者名稱,預設guest(普通使用者) char id[9];//ISO14443A卡id號 "ffff ffff" char type[8];//vip或average char tell[12]; }reg_data; typedef struct car_io{//進出卡結構體 char name[10]; char id[9]; char time[9]; char mday[3]; char mon[4]; char wday[4]; char year[5]; char charge[7]; }car_io_data; /*連結串列節點結構體*/ typedef struct reg_node{//註冊使用者連結串列節點結構體 reg_data data; struct reg_node *prev, *next; }regnode, *regp; typedef struct car_io_node{//進出卡連結串列節點結構體 car_io_data data; struct car_io_node *prev, *next; }car_ionode, *car_iop; typedef struct list{ regp reg_head; car_iop car_io_head; char number[4]; }*listp; void *car_in(void *arg) { printf("car_in\n"); listp test = (listp)arg; printf("%s\n",test->number); pthread_exit(NULL); } void *car_out(void *arg) { printf("car_out\n"); pthread_exit(NULL); } int main(void) { pthread_t in, out; listp list = malloc(sizeof(list)); strcpy(list->number ,"999"); // regp reg_head = reg_init(); // car_iop car_io_head = car_io_init(); pthread_create(&in, NULL, &car_in, (void *)list); pthread_create(&out, NULL, &car_out, NULL); pthread_join(in, NULL); pthread_join(out, NULL); return 0; }