我正在尝试将结构的指针传递给函数,但是当我尝试访问结构时,结构中的最后一个变量丢失了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;
}
Run Code Online (Sandbox Code Playgroud)
发生的事情是cmd_test(产生线程的函数)内部结构被正确初始化并且所有变量都是正确的.
$1 = {tID = 0, sock = 5, arg_count = 5, from_p = 0xbffff254 "test", arg_p = 0xbfffec48}
Run Code Online (Sandbox Code Playgroud)
但是,如果在运行的线程内部使用test_cmd,则结构缺少arg_p的地址1个字节,导致:
$1 = {tID = 0, sock = 5, arg_count = 5, from_p = 0xbffff254 "test", arg_p = 0xffec48}
Run Code Online (Sandbox Code Playgroud)
如果我在command_struct arg_p的地址末尾添加一个无用的变量然后变得正确,并且command_struct中的最后一个变量缺少1个字节的内存地址.
您将指向局部变量的指针传递给线程 - 当线程访问它时,内存已被重用于其他用途。
尝试这个:
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;
}
// === 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...
// ...
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
5074 次 |
| 最近记录: |