Ваш код не выполняется из-за приоритета операции оператора *
и операции []
.[]
имеет более высокий приоритет, поэтому вам нужно изменить код на:
WORD ReadBigEndianWORD(char **Data)
{
WORD Result = (unsigned char) (*Data)[0];
Result <<= 8;
Result |= (unsigned char) (*Data)[1];
(*Data) += sizeof(WORD);
return Result;
}
Строка с *Data[0]
в итоге работает правильно, потому что вы добавляете нулевое смещение.Второй *Data[1]
либо вылетит, но и даст вам неверные данные, потому что они читают неинициализированную память.*Data[1]
эквивалентно \*(\*(Data + sizeof(char**)))
, поэтому оно указывает место, где хранится память, и движется дальше.
Лучший способ увидеть, что происходит, - это использовать свой исходный ReadBigEndianWORD
и изменить код вызова на:
char *Memory[2] = { "........", ",,,,,,,,," };
short Myshort = ReadBigEndianshort(Memory);
Если вы сделаете это, вы увидите, что * Data [1] указывает на Память [1].
А затем, чтобы переместить указатель данных на следующую работу, вам нужно увеличить его на размер WORD
, а не на char**
, что есть ++
будет делать.
Но, как уже говорили все, вы должны изменить свой метод на char*
, а затем беспокоиться о перемещении в вашем буфере в вызывающем коде.Это сделает вашу функцию чище и понятнее.