С структуры в указатель Void*


У меня есть структура, определенная как:

typedef struct {
   int type;
   void* info;
} Data;

И затем у меня есть несколько других структур, которые я хочу назначить void*, используя следующую функцию:

Data* insert_data(int t, void* s)
{
    Data * d = (Data*)malloc(sizeof(Data));
    d->type = t;
    d->info = s;

    return d;
}

struct {
   ...
} Struct#;

Тогда я просто позвоню

insert_data(1, variable_of_type_Struct#);

Когда я компилирую это, он выдает предупреждение

warning: assignment from incompatible pointer type

Я попытался привести переменную в insert к (void*), но не получилось

insert_data(1, (void *) variable_of_type_Struct#);

Как я могу избавиться от этого предупреждения?

Спасибо

5 4

5 ответов:

Передают в адрес структуры, а не ее копии (т. е. не передают по значению):

insert_data(1, &variable_of_type_Struct);

Передайте указатель на объект struct:

struct your_struct_type bla;

insert_data(1, &bla);

Надеюсь, эта программа поможет!

#include <stdio.h>
#include <stdlib.h>

typedef struct {
   int type;
   void* info;
} Data;

typedef struct {
    int i;
    char a;
    float f;
    double d;  
}info;

Data* insert_data(int t, void* s)
{
    Data * d = (Data*)malloc(sizeof(Data));
    d->type = t;
    d->info = s;

    return d;
}

int main()
{
    info in; 
    Data * d;
    d = insert_data(10, &in);

    return 0;
}

Я не совсем уверен, что это было:

struct {
   ...
} Struct#;

Итак, я немного очистил вашу программу и не получил никаких предупреждений, после ввода адреса структуры в вызов, insert_data(1, &variable_of_type_Struct);

#include <stdlib.h>
#include <stdio.h>

typedef struct {
    int type;
    void* info;
} Data;

Data* insert_data(int t, void* s);

Data variable_of_type_Struct;

Data* insert_data(int t, void* s)
{
    Data * d = (Data*)malloc(sizeof(Data));
    d->type = t;
    d->info = s;

    return d;
}

void test()
{
    insert_data(1, &variable_of_type_Struct);
}

insert_data ждет a void*, вы ставите a Data.

insert_data(1, &variable_of_type_Struct#);

Это упускает уровень косвенности.