Что делает этот короткий фрагмент кода C - PullRequest
1 голос
/ 26 января 2010

Может кто-нибудь объяснить, что делает этот код

size = *(int *)data;        // size of string plus header word
off = (size + 3) & ~3;
chan = *(int *)(data + off);
data[size] = '\0';      // zero terminate

Я думаю, что это связано с тем, чтобы сделать данные кратными 4?

Ответы [ 3 ]

3 голосов
/ 26 января 2010

Предполагая, что data является char* ...

size = *(int *)data;        // size of string plus header word

data интерпретируется как указатель на int, затем разыменовывается и присваивается size.

off = (size + 3) & ~3;

Это округляет size вверх до ближайшего кратного 4 и присваивает off.

chan = *(int *)(data + off);

Значение chan, по-видимому, находится off байт из data.

data[size] = '\0';      // zero terminate

Это очевидно.

1 голос
/ 26 января 2010

Эта строка приводит data к указателю на int, разыменовывает указатель и сохраняет значение в переменной с именем size:

size = *(int *)data;  

Эта строка получает наименьшее из четырех значений, большее или равное size, и присваивает результат переменной off:

off = (size + 3) & ~3;

Эта строка получает смещение int значения sizeof(char) * off байтов от указателя data и сохраняет результат в chan:

chan = *(int *)(data + off);

Эта строка завершает блок памяти нулем:

data[size] = '\0';

Таким образом, похоже, size - это блок памяти, в котором первые sizeof(int) байтов data могут рассматриваться как int, обозначающие size блока памяти. Очевидно, что есть значимые данные в data плюс sizeof(char) * smallestmultipleoffourlargerthan(size). Не зная подробностей data, это лучшее, что мы можем сказать.

0 голосов
/ 26 января 2010

Опираясь на ответ Джейсона, похоже, что этот код разделяет содержимое структуры данных, начало которой хранится в data. Структура данных, которая там хранится, кажется, отформатирована примерно так:

{
  int size;
  char data[(size + 3) & ~3];
  int chan;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...