将结构作为void指针传递给函数
发布时间:2020-12-16 05:02:24 所属栏目:百科 来源:网络整理
导读:我正在尝试将结构的指针传递给函数,但是当我尝试访问结构时,结构中的最后一个变量丢失了1个字节的内存地址,从而导致使用该变量进行段错误. typedef struct{ pthread_t tID; int tType;}sThread;sThread threads[MAX_THREADS];typedef struct{ int tID; int s
我正在尝试将结构的指针传递给函数,但是当我尝试访问结构时,结构中的最后一个变量丢失了1个字节的内存地址,从而导致使用该变量进行段错误.
typedef struct { pthread_t tID; int tType; }sThread; sThread threads[MAX_THREADS]; typedef struct { int tID; int sock; int arg_count; char *from_p,**arg_p; }command_struct; pthread_t Thread_Start(void *function,void *param) { pthread_t tHandle; pthread_create(&tHandle,NULL,function,(void*)param); return tHandle; } void cmd_test(int sock,char *from_p,char **arg_p,int arg_count) { if(thread_check(1)) { send_line(sock,"%s :test thread already running",from_p); return; } command_struct test; test.tID = thread_add(1); test.arg_count = arg_count; test.arg_p = arg_p; threads[test.tID].tID = Thread_Start(test_cmd,&test); } void *test_cmd(void *param) { command_struct test = *((command_struct *)param); int i = 0; for(i = 1; i < test.arg_count; i++) { printf("%s",test.arg_p[i]); } thread_clear(test.tID); return NULL; } 发生的事情是cmd_test(产生线程的函数)内部结构被正确初始化并且所有变量都是正确的. $1 = {tID = 0,sock = 5,arg_count = 5,from_p = 0xbffff254 "test",arg_p = 0xbfffec48} 但是,如果在运行的线程内部使用test_cmd,则结构缺少arg_p的地址1个字节,导致: $1 = {tID = 0,arg_p = 0xffec48} 如果我在command_struct arg_p的地址末尾添加一个无用的变量然后变得正确,并且command_struct中的最后一个变量缺少1个字节的内存地址. 解决方法
你将一个指向局部变量的指针传递给你的线程 – 当线程访问它时,内存已被重用于其他东西.
试试这个: void cmd_test(int sock,int arg_count) { if(thread_check(1)) { send_line(sock,from_p); return; } // === begin modified code in cmd_test(): command_struct* test = malloc(sizeof(command_struct)); test->tID = thread_add(1); test->arg_count = arg_count; test->arg_p = arg_p; threads[test.tID].tID = Thread_Start(test_cmd,test); // === end modified code } void *test_cmd(void *param) { command_struct test = *((command_struct *)param); free(param); // <-- new line of code // remainder is the same... // ... } (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |