【问题标题】:C struct to void* pointerC struct 到 void* 指针
【发布时间】:2012-05-06 08:08:36
【问题描述】:

我有一个结构定义为:

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

我怎样才能摆脱这个警告?

谢谢

【问题讨论】:

  • 铸造mallocis unnecessary的结果。 Data * d = malloc(sizeof(Data)); 就足够了。
  • 我感觉这些尖锐的“#”字符也在您的代码中。它们与宏连接,不确定它们在您的代码中做什么。
  • 为什么这个 struct {...} Struct#;在你的代码中?我只是好奇。

标签: c void-pointers structure


【解决方案1】:

传入结构的地址,而不是它的副本(即不是按值传递):

insert_data(1, &variable_of_type_Struct);

【讨论】:

  • 试过了。 insert_data(1, (void *) &variable_of_type_Struct#);也没有用
  • 你的变量是什么类型的?顺便说一句,这里不需要投射。证明相关类型,我们不是魔术师,无法看到您的 typedef 背后隐藏着什么。答案是有效的。
  • @Nitrate 你在哪里搞砸了?
  • @hmjd 不信任 Ideone。我在 gcc 上有一个非常相似的问题,但我的代码实际上在 Ideone 上编译时没有警告。
【解决方案2】:

传递一个指向结构对象的指针:

struct your_struct_type bla;

insert_data(1, &bla);

【讨论】:

    【解决方案3】:

    希望这个程序有所帮​​助!

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

    【讨论】:

    • 这就是我所拥有的。结构 { ... } 结构#;然后我只调用 insert_data(1, variable_of_type_Struct#);这是一个 Struct# *变量
    • 说你有struct { ... },那么你必须打电话给insert_data(int, struct *)而不是insert_data(int, struct)。传递结构的地址。
    • 这很好,但您在这里使用未初始化的数据。也忽略任何类型的检查(malloc、frees)。
    • @AoeAoe 同意。我试图演示如何发送结构而不是结构的地址。
    • @SangeethSaravanaraj 您发送了一份指向 struct imo 的指针副本。要发送结构地址,他需要 &struct .
    【解决方案4】:

    我不太确定这是什么:

    struct {
       ...
    } Struct#;
    

    所以,在将结构的地址放入调用insert_data(1, &amp;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);
    }
    

    【讨论】:

      【解决方案5】:

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

      insert_data(1, &variable_of_type_Struct#);
      

      它错过了一个间接级别。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2015-11-08
        • 1970-01-01
        • 2014-05-30
        • 2014-04-04
        • 1970-01-01
        • 2012-07-01
        • 2011-03-11
        • 1970-01-01
        相关资源
        最近更新 更多