Как создать структуру, содержащую указатель на другую структуру неопределенного типа? - PullRequest
1 голос
/ 13 февраля 2020

Это структура, которая будет содержать другую (переменную) структуру:

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;  

Я не уверен, возможно ли то, что я спрашиваю, или только ли мой подход к этому неверен. Спасибо за вашу помощь.

1 Ответ

1 голос
/ 13 февраля 2020

Функция strlen ожидает указатель на завершенную нулем строку. В createHandle, struct_pointer - это не строка с нулевым символом в конце, а указатель на PS_call_struct, так что это не сработает, как вы ожидаете.

На самом деле вы просто хотите назначить указатель на struct_pointer:

new->struct_pointer = struct_pointer;

Кроме того, это не имеет смысла:

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

Поскольку поле option является не указателем, а просто int, так что избавьтесь malloc вызова.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...