на языке Си: операторы '= {}' против нормального нормального равного оператора '=' - PullRequest
0 голосов
/ 13 января 2019

Я работал с 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 до корзина ?

  • когда мне следует использовать преобразование типа, например (void*), и что не так с приведенной выше строкой ключа, если не было (void *), будет ли она скомпилирована как const char *?

1 Ответ

0 голосов
/ 13 января 2019

Быстрый поиск в Google обнаружил эту ссылку с внутренней структурой gnutls_datum_t:

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

Как видите, эта структура имеет два поля, data и size. Вот почему, когда они инициализируют 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

По поводу вашего другого вопроса:

Подробнее об инициализации переменной в C вы можете узнать, используя список инициализаторов здесь . Существует несколько разных сценариев.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...