很明显,我是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)都有可变长度?
感谢帮助。
答案 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;