Подтвердить что ты не робот

Индекс указателя и индекс массива

Я знаю, что это было хэшировано в течение некоторого времени, но сегодня я столкнулся с ситуацией, которая потрясла мое понимание указателя math/array index.

Как я всегда это понимал, & mybuff [10] и (& mybuff + 10) являются равноценными способами ссылки на одну и ту же память.

Однако я провел утро, сражаясь с случаем, где:

memcpy(&mybuff+10,&in,8); 

переполнил буфер, когда скомпилирован с оптимизацией и работал отлично, когда скомпилирован для отладки.

В то же время,

memcpy(&mybuff[10],&in,8); 

работал отлично в обоих случаях.

Большое спасибо за любые идеи или указатели.

4b9b3361

Ответ 2

Я придумаю выражение для mybuff для примера:

char mybuff[123];

Теперь &mybuff+10 делает указатель арифметическим на &mybuff, который имеет тип "указатель на массив из 123 символов". Это отличается от простого mybuff, который (после распада указателя) имеет тип "указатель на char". Битное значение этих двух выражений одно и то же, но поскольку они являются указателями на вещи разных размеров, они ведут себя по-разному под арифметикой указателя.

&mybuff+10 означает, что вы хотите пройти мимо десяти из 123- char массивов в типе (что бессмысленно с учетом объявления и может segfault), тогда как mybuff+10 просто говорит, что вы хотите пройти за десять отдельные символы.

Ответ 3

&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, но мне нравится поощрять людей просматривать его, все это стоит прочитать.)

Ответ 4

Я думаю, что у вас есть проблемы с указателями.
Если mybuff - это указатель, тогда mybuff + 10 == &(mybuff[10]).
Это не то же самое, что &mybuff + 10, как у вас там.

Ответ 5

(&mybuff+10) и &mybuff[10] не являются эквивалентными, но &mybuff[10] и mybuff + 10.

Ответ 6

Правильный синтаксис mybuff+10 not &mybuff+10, который говорит, что переместитесь в позицию 10 в вашем массиве и скопируйте 8 байтов (на ваш оператор memcpy). Пока неизвестно, действительно ли вы можете хранить еще 8 байтов.

Ответ 7

Причина, по которой он работал в режиме отладки, заключается в том, что в режиме отладки память инициализируется для вас, а распределения также больше, чем фактический размер. http://msdn.microsoft.com/en-us/library/bebs9zyz(v=vs.80).aspx