C 结构体转换为 void* 指针

12

I have a struct defined as:

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

我尝试将插入操作中的变量转换为(void*),但没有成功。

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

我该如何消除这个警告?

谢谢


malloc 的结果进行转换是不必要的。只需要写成 Data * d = malloc(sizeof(Data)); 即可。 - Matheus Moreira
2
我感觉你的代码中也有这些尖锐的 '#' 字符。它们与宏相关联,不确定它们在你的代码中是做什么的。 - Tomas Pruzina
你的代码中为什么要加上这个结构体{...} Struct#?我只是好奇。 - octopusgrabbus
5个回答

15

传递结构体的地址,而不是它的副本(即不通过值传递):

insert_data(1, &variable_of_type_Struct);

尝试过了。插入数据(1,(void *)& variable_of_type_Struct#)也不起作用。 - Nitrate
你的变量是什么类型?顺便说一句,这里不需要强制转换。请提供相关类型,我们不是魔术师,无法看到typedef背后隐藏的内容。答案仍然有效。 - Tomas Pruzina
1
@Nitrate 你哪里出了问题? - Tomas Pruzina
@hmjd 不要相信 Ideone。我在 gcc 上遇到了非常类似的问题,但我的代码在 Ideone 上实际上可以编译而没有警告。 - mfloris

5

传递指向结构体对象的指针:

struct your_struct_type bla;

insert_data(1, &bla);

4
希望这个程序能够帮到您!
#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#); 其中 variable_of_type_Struct# 是一个 Struct# 类型的指针变量。 - Nitrate
假设你有一个 struct { ... },那么你必须调用 insert_data(int, struct *) 而不是 insert_data(int, struct)。传递结构体的地址。 - Sangeeth Saravanaraj
2
这很不错,但你在处理未初始化的数据。而且忽略了任何类型的检查(malloc、frees)。 - Tomas Pruzina
@AoeAoe 同意。我想要演示如何发送一个结构体的地址,而不是整个结构体本身。 - Sangeeth Saravanaraj
@SangeethSaravanaraj,你发送了一个指向结构体的指针副本。 要发送结构体的地址,他需要使用_&_struct_。 - Tomas Pruzina
@SangeethSaravanaraj 如何检查程序中是否有信息结构体? - Man Man Yu

2

我不太确定这是什么:

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);
}

0

insert_data 等待一个 void*,而你放了一个 Data

insert_data(1, &variable_of_type_Struct#);

它缺少一个间接层。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接