首页 > 解决方案 > 如何创建一个包含指向另一个未指定类型的结构的指针的结构?

问题描述

这是将包含另一个(变量)结构的结构:

typedef struct {
    char * mem_addr;
    char * name;
    int option;
    void * struct_pointer;
} Handle;  

我不知道该结构将是什么,因为我希望有一组可供嵌套的结构,然后根据需要转换为正确的类型。一个例子可能是:

typedef struct{
    char *  policy;
    int     size;
    char *  addr;
} PS_call_struct;

我用这个函数初始化这些结构:

threadHandle * createHandle(char * mem_addr, char * name, int option, void * struct_pointer){
    threadHandle * new = malloc(sizeof(threadHandle));

    new->mem_addr = malloc(strlen(mem_addr)+1);
    strcpy(new->mem_addr,mem_addr);

    new->name = malloc(strlen(name)+1);
    strcpy(new->name,name);

    new->option = malloc(sizeof(int));
    new->option = option;

    new->struct_pointer = malloc(strlen(struct_pointer)+1);
    strcpy(new->struct_pointer,struct_pointer);

    return new;
}

和这个:

PS_call_struct * createPS_call_struct(char *policy, int size, char *addr){
    PS_call_struct * new = malloc(sizeof(PS_call_struct));

    new->policy = malloc(strlen(policy)+1);
    strcpy(new->policy, policy);

    new->size = malloc(sizeof(int));
    new->size = size;

    new->addr = malloc(strlen(addr)+1);
    strcpy(new->addr, addr);        

    return new;
}

一旦我想使用嵌套结构,我就对其进行了转换。我测试如下:

PS_call_struct * ps1 = createPS_call_struct(&h, 999, &k);
Handle * write_handle = createHandle(SRV_SOCK_PATH, "thread_cream",777,ps1);
PS_call_struct * techk = (PS_call_struct* )(write_handle->struct_pointer);

现在我遇到了一个问题,因为重铸后我无法访问任何值。我可以ps1毫无问题地访问值,但值techk大多为空。我不能像下面那样指定结构类型,因为我想选择使用另一种类型的结构。

typedef struct {
    char * mem_addr;
    char * name;
    int option;
    int write_byte_size;
    PS_call_struct * struct_pointer;
} Handle;  

我不确定我所问的是否真的可行,或者我的方法是否不正确。谢谢您的帮助。

标签: cstructcastingsegmentation-faultmalloc

解决方案


strlen函数需要一个指向空终止字符串的指针。In createHandle,struct_pointer不是以空结尾的字符串,而是指向 的指针PS_call_struct,因此这不会像您期望的那样工作。

您真正想要的是简单地将指针分配给struct_pointer

new->struct_pointer = struct_pointer;

另外,这没有意义:

new->option = malloc(sizeof(int));
new->option = option;

因为该字段option不是指针而只是一个int,所以摆脱malloc调用。


推荐阅读