如何将函数中的一个参数作为void指针参数强制转换为整数

问题描述 投票:0回答:1

我有这个功能很有趣,我将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);
    ...
}

另外,如何为头节点进行投射?有人可以请教吗?

c pointers
1个回答
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)
© www.soinside.com 2019 - 2024. All rights reserved.