错误:从类型'digestInfo'分配类型'char *'时出现不兼容的类型

时间:2014-06-19 15:14:53

标签: c

很明显,我是C编程新手。 (我知道其他语言,特别是PHP,但想要​​去C)。

我已经成功地将一些代码组合在一起,这些代码完全按照我想要的方式工作 - 我现在正在扩展它 - 我无法弄清楚如何做到这一点。

一些背景知识。我正在使用这个对象:

typedef struct
{
   dsUint16_t   stVersion;                       
... (omitted for clarity)
   dsUint16_t   objInfoLength;                  
   char         *objInfo;                       
... (omitted for clarity)
}ObjAttr;

对我来说,* ObjInfo是一个可以用来存储一些数据的区域,它将是一个对象(struct?),所以我是用typedef创建的:

typedef struct {
    unsigned int stVersion ;                /* structure version */
    const EVP_MD *digest_id ;               /* digest name */
    unsigned char digest_value ;            /* digest calculated value (Variable length) */
//  ...                                     /* in the future I may want to store something else */
} digestInfo ;

我在.h文件中有这个结构,因此可以在我的.c文件中引用它。

现在在.c文件中,我存储了这些数据(最终在应用程序数据库中),我有这个代码:

...
ObjAttr objAttr;
digestInfo digestO;
...
memset(&digestO,0x00,sizeof(digestO));
digestO.stVersion = 1;
digestO.digest_id = EVP_get_digestbyname(digest);
...
EVP_DigestFinal_ex(&mdctx, md_value, &md_len);
digestO.digest_value = *md_value;

objAttr.objInfo = *digestO;
objAttr.objInfoLength = sizeof(digestO);

编译时,我收到此错误:

error: invalid type argument of ‘unary *’ (have ‘digestInfo’)

我知道它,因为我试图将digestInfo对象存储到char值中 - 我应该怎么做?

我尝试了

的组合
objAttr.objInfo = digestO;
objAttr.objInfo = &digestO;

但是仍然会得到各种错误(尽管最后一个错误地编译了警告)。

我在这里走在正确的轨道上吗? (基本上我正在计算通过STDIN(存储在应用程序中)的一些数据的MD5,我想将我的哈希计算存储在ObjAttr的“objInfo”区域。

我希望将所使用的算法(md5,sha1等)与结果哈希包括在一起,这样当我检索该数据时,我可以重新运行摘要以确保我仍然获得相同的哈希值。 / p>

如果我想跟踪这个问题,有人会介意我朝正确的方向前进吗?

我是否正确使用memset,将内存归零?

我是否应该担心每个变量(digest_id,digest_value)都有可变长度?

感谢帮助。

1 个答案:

答案 0 :(得分:0)

字段objInfo是一个字符指针(char *),因此你必须指定一个指向它的指针,由&获取。在"对象"。所以objAttr.objInfo = &digestO;是最接近的尝试,但& digest0是指向digestInfo的指针,所以你可能想要改变

typedef struct
{
   dsUint16_t   stVersion;                       
... (omitted for clarity)
   dsUint16_t   objInfoLength;                  
   char         *objInfo;                       
... (omitted for clarity)
}ObjAttr;

typedef struct
{
   dsUint16_t   stVersion;                       
... (omitted for clarity)
   dsUint16_t   objInfoLength;                  
   digestInfo    *objInfo;                       
... (omitted for clarity)
}ObjAttr;