我正在使用这个函数很有趣,我将nums结构作为参数传递。问题是我需要将此字段转换为函数内的整数。 如何在不改变我在函数中传递结构的方式的情况下执行此操作?
以下是我要做的事情:
struct node{
char *str;
struct node *next;
};
struct numbers{
struct node *head;
int *new_a;
};
void *fun(void *args);
int main(int argc , char *argv[])
{
int *new_a, num_a;
struct node *head=NULL;
struct numbers *args = (struct numbers *)malloc(sizeof(struct numbers));
num_a = returnNum();
pthread_t pthread;
new_a = malloc(1);
*new_a = num_a;
args->new_a=new_a;
if( pthread_create( &pthread , NULL , (void *) &fun , (void *) &args) < 0)
{
perror("could not create thread");
return 1;
}
}
void *fun(void *args){
//void *num_a = (int *) args->new_a;
//int num_a = *(int*)(args->new_a);
struct numbers *temp_str = (struct numbers *) (*args);
int num_a = (int) *(args->new_a);
...
}
另外,如何为头节点进行投射? 有人可以请教吗?
答案 0 :(得分:3)
由于struct numbers *
传递给fun
,您需要将参数分配给此类型的变量。然后你可以使用struct。
void *fun(void *arg){
struct numbers *temp_str = arg; // no need to cast from void *
int num_a = temp_str->new_a;
...
}
填充结构的方式也存在问题:
int *new_a, num_a;
...
new_a = malloc(1);
*new_a = num_a;
args->new_a=new_a;
您没有为new_a
分配足够的空间。您只分配1个字节,但大多数系统上的int
为4个字节。当您随后从此内存位置读取和写入时,您将读取/写入已分配的内存的末尾。这会调用undefined behavior,在这种情况下会显示为崩溃..
您可以通过分配适当的空间来解决此问题:
new_a = malloc(sizeof(*new_a));
但是,您根本不需要为此字段使用动态内存分配。只需将new_a
声明为int
并直接写入:
struct numbers{
struct node *head;
int new_a;
};
...
args->new_a = returnNum();
您也不需要使用args
的地址。它是一个指针,所以直接传递给pthread_create
:
if( pthread_create( &pthread , NULL , fun , args) < 0)