1. 程式人生 > >執行緒傳遞結構體引數(Segmentation fault (core dumped))

執行緒傳遞結構體引數(Segmentation fault (core dumped))

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;

}