Ответ 1
см. http://cplusplus.com/doc/tutorial/operators/ для приоритетного порядка операторов &mybuff+10
как (&mybuff)+10
&mybuff[10]
как &(mybuff[10])
Edit
также некоторые указатели http://cplusplus.com/doc/tutorial/pointers/
Я знаю, что это было хэшировано в течение некоторого времени, но сегодня я столкнулся с ситуацией, которая потрясла мое понимание указателя math/array index.
Как я всегда это понимал, & mybuff [10] и (& mybuff + 10) являются равноценными способами ссылки на одну и ту же память.
Однако я провел утро, сражаясь с случаем, где:
memcpy(&mybuff+10,&in,8);
переполнил буфер, когда скомпилирован с оптимизацией и работал отлично, когда скомпилирован для отладки.
В то же время,
memcpy(&mybuff[10],&in,8);
работал отлично в обоих случаях.
Большое спасибо за любые идеи или указатели.
см. http://cplusplus.com/doc/tutorial/operators/ для приоритетного порядка операторов &mybuff+10
как (&mybuff)+10
&mybuff[10]
как &(mybuff[10])
Edit
также некоторые указатели http://cplusplus.com/doc/tutorial/pointers/
Я придумаю выражение для mybuff
для примера:
char mybuff[123];
Теперь &mybuff+10
делает указатель арифметическим на &mybuff
, который имеет тип "указатель на массив из 123 символов". Это отличается от простого mybuff
, который (после распада указателя) имеет тип "указатель на char". Битное значение этих двух выражений одно и то же, но поскольку они являются указателями на вещи разных размеров, они ведут себя по-разному под арифметикой указателя.
&mybuff+10
означает, что вы хотите пройти мимо десяти из 123- char массивов в типе (что бессмысленно с учетом объявления и может segfault), тогда как mybuff+10
просто говорит, что вы хотите пройти за десять отдельные символы.
&mybuff[10]
эквивалентен &mybuff[0] + 10
, что эквивалентно mybuff + 10
Индексирование массива определяется в терминах арифметики указателя. p[i]
означает *(p+i)
(я игнорирую необходимость дополнительных скобок в случае, если p
или i
является более сложным выражением), где p
- значение указателя, а i
- целочисленное значение.
Общая информация: поскольку добавление, даже добавление указателя + целого, является коммутативным, p[i]
также может быть записано как i[p]
. Да, 4["Hello"] == 'o'
. Ради кого-либо, кто читает ваш код в будущем, не используйте эти знания.
Отличная ссылка на отношения между массивами и указателем в C (и С++, где правила почти идентичны) - это раздел 6 comp.lang. c FAQ. (Я мог бы напрямую связать с разделом 6, но мне нравится поощрять людей просматривать его, все это стоит прочитать.)
Я думаю, что у вас есть проблемы с указателями.
Если mybuff - это указатель, тогда mybuff + 10 == &(mybuff[10])
.
Это не то же самое, что &mybuff + 10
, как у вас там.
(&mybuff+10)
и &mybuff[10]
не являются эквивалентными, но &mybuff[10]
и mybuff + 10
.
Правильный синтаксис mybuff+10
not &mybuff+10
, который говорит, что переместитесь в позицию 10 в вашем массиве и скопируйте 8 байтов (на ваш оператор memcpy). Пока неизвестно, действительно ли вы можете хранить еще 8 байтов.
Причина, по которой он работал в режиме отладки, заключается в том, что в режиме отладки память инициализируется для вас, а распределения также больше, чем фактический размер. http://msdn.microsoft.com/en-us/library/bebs9zyz(v=vs.80).aspx