在C语言中:'= {}'运算符与普通普通等于'='运算符

时间:2019-01-13 16:19:07

标签: c

我正在使用 gnutls aes加密,这就是我的代码

const gnutls_datum_t * key;
*key = (const char*)"tZOVP7o/u2vQB+4B/0O0ZqLWvydBni8qWnUTFMU5yx4=";

,并且在编译 GCC 时说

error: no match for ‘operator=’ (operand types are ‘const gnutls_datum_t’ and ‘const char*'

然后我来看gnutls文档,并且看到了这样的实现

const gnutls_datum_t key = {
  (void *)
    "\xaa\xf4\xc6\x1d\xdc\xc5\xe8\xa2\xda\xbe"
    "\xde\x0f\x3b\x48\x2c\xd9\xae\xa9\x43\x4d",
  20
};

现在我的问题是:

  • =={ }之间的区别是什么,为什么他在后面的末尾放20,是字符串转换后的大小从 hex bin 吗?

  • 我何时应该使用像(void*)这样的类型转换,如果没有(void *)的话,上述键字符串怎么了,会被编译为 const char *

1 个答案:

答案 0 :(得分:1)

谷歌快速搜索发现this link的内部结构为gnutls_datum_t

 typedef struct
 {
   unsigned char *data;
   unsigned int size;
 } gnutls_datum_t;

如您所见,此结构具有两个字段datasize。这就是为什么当他们初始化key时,他们传递两个变量,中间用逗号分隔。

第一个设置data的值为:

(void *)
  "\xaa\xf4\xc6\x1d\xdc\xc5\xe8\xa2\xda\xbe"
  "\xde\x0f\x3b\x48\x2c\xd9\xae\xa9\x43\x4d"

第二个设置size的值为:

20

关于您的其他问题:

您可以使用列表初始化器here阅读有关C语言中变量初始化的更多信息。有多种不同的情况。