我正在尝试将结构体指针传递给函数,但是当我尝试访问结构体时,结构体内的最后一个变量会丢失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中,结构体缺失了1个字节的arg_p地址,导致出现如下问题:
$1 = {tID = 0, sock = 5, arg_count = 5, from_p = 0xbffff254 "test", arg_p = 0xffec48}
如果我在command_struct参数的末尾添加一个无用变量,那么arg_p的地址就会变得正确,而command_struct中最后一个变量的内存地址会减少1个字节。
argp
,有时使用arg
。这只是试图总结问题的错误吗,还是在调试器中实际上称为argp
,而在代码中称为arg
?我担心你正在调试与你想象的不同的东西,或者你包含了错误的头文件。解决这个问题的一种方法,也有助于在 StackOverflow 上发布问题,就是尝试将程序缩减到演示问题的最小示例。这样做可能会帮助你找到它;如果找不到,你可以在这里发布完整的程序,这样更容易找到问题。 - Brian CampbellThread_Start
的第一个参数应该是void *(*function)(void*)
。 - Daniel Fischer