C 无法从指针读取值

C 无法从指针读取值,c,pointers,void-pointers,C,Pointers,Void Pointers,无法从无效指针读取数据: #include <windows.h> typedef enum { ADDRESS, PERSON, } DataType; typedef struct { DataType type; void* data; } Data; Data* create_data(DataType type, void* data); typedef struct { char* number; char* str

无法从无效指针读取数据:

#include <windows.h>

typedef enum {
    ADDRESS,
    PERSON,
} DataType;

typedef struct {
    DataType type;
    void* data;
} Data;

Data* create_data(DataType type, void* data);

typedef struct {
    char* number;
    char* street;
    char* city;
    char* state;
    char* postalCode;
} Address;

typedef struct {
    int age;
    char* name;
} Person;

int CALLBACK WinMain(
    HINSTANCE hInstance,
    HINSTANCE hPrevInstance,
    LPSTR     lpCmdLine,
    int       nShowCmd
) {
    // WRITE

    Address* home = malloc(sizeof(Address));
    home->number = "123";
    home->street = "Main";
    home->city = "New York";
    home->state = "NY";
    home->postalCode = "10001";

    Data* addressdata = create_data(ADDRESS, &home);

    // READ

    char* addressstreet = ((Address*)addressdata->data)->street;

}

Data* create_data(DataType type, void* data)
{
    Data* d = (Data*)malloc(sizeof(Data));
    d->type = type;
    d->data = data;

    return d;
}
#包括
类型定义枚举{
住址
人
}数据类型;
类型定义结构{
数据类型;
作废*数据;
}数据;
数据*创建_数据(数据类型,void*数据);
类型定义结构{
字符*数字;
查*街;
查尔*城市;
字符*状态;
字符*后代码;
}地址;
类型定义结构{
智力年龄;
字符*名称;
}人;
int回调WinMain(
HINSTANCE HINSTANCE,
HINSTANCE HPPrevenstance,
LPSTR lpCmdLine,
int nShowCmd
) {
//写
地址*home=malloc(sizeof(地址));
主页->编号=“123”;
home->street=“Main”;
主页->城市=“纽约”;
主页->状态=“纽约”;
主页->postalCode=“10001”;
数据*地址数据=创建数据(地址和主页);
//阅读
char*addressstreet=((Address*)addressdata->data)->street;
}
数据*创建_数据(数据类型,void*数据)
{
数据*d=(数据*)malloc(sizeof(数据));
d->type=type;
d->data=数据;
返回d;
}

读完你的问题后,我脑海中浮现的第一件事是,既然一个空指针没有对象类型,你怎么能取消它的引用呢

中存在
参数
不匹配

Data*创建_数据(数据类型,void*数据)
数据*地址数据=创建数据(地址和主页)

而不是发送
主页的地址
,即
创建_数据(地址和主页)发送
创建_数据(地址、家庭)

创建数据(地址和家庭)
这将
地址**
传递到呼叫中。您可能只需要
home
here.change
create\u数据(地址,&home)创建数据(地址、家庭)
将解决问题Read,在编译器中启用所有警告和调试信息,请参阅