Я не понимаю какую-то старую конкатенацию массива C - PullRequest
3 голосов
/ 04 февраля 2011

Я не понимаю этот синтаксис в этой старой C программе, и я не настроен для тестирования кода, чтобы увидеть, что он делает. Часть, в которой я запутался, - это конкатенация с массивом. Я не думал, что C мог бы справиться с авто-типизацией таким образом, или я слишком усложняю то, что в пятницу днем ​​...

char wrkbuf[1024];
int r;
//Some other code
//Below, Vrec is a 4 byte struct
memcpy( &Vrec, wrkbuf + r, 4 );

Есть идеи, что здесь будет? Чем становится wrkbuf, когда вы объединяете или добавляете к нему int?

Ответы [ 2 ]

4 голосов
/ 04 февраля 2011

wrkbuf + r совпадает с &wrkbuf[r]

По существу wrkbuf при использовании, как в выражении wrkbuf + 4 "разлагается" на указатель на первый элемент. Затем вы добавляете r к нему, что продвигает указатель на r элементов. то есть здесь нет конкатенации, она выполняет арифметику с указателями.

memcpy( &Vrec, wrkbuf + r, 4 ); копирует 4 байта из массива wrkbuf, начиная с r-го элемента, в область памяти Vrec

2 голосов
/ 04 февраля 2011

memcpy(&Vrec, wrkbuf + r, 4) копирует 4 байта из r -ой позиции wrkbuf в Vrec.Когда вы добавляете int к массиву, вы получаете адреса памяти его r -ой позиции, в данном случае &wrkbuf[r].

Пример реализации memcpy C (как вы можете видеть, это очень похоже на strcpy):

void *
memcpy (void *destaddr, void const *srcaddr, size_t len)
{
  char *dest = destaddr;
  char const *src = srcaddr;

  while (len-- > 0)
    *dest++ = *src++;
  return destaddr;
}

См .:

...