Ваша программа не должна сталкиваться с какой-либо проблемой во время компиляции. Это все допустимый код в отношении компиляции.
Однако он будет сталкиваться с неопределенным поведением во время выполнения, поскольку a+5
недействительный адрес.
Если вы хотите знать, почему он должен собрать, вы можете написать код так:
int func(int * buf, size_t size)
{
for(size_t i = 0; i < size; ++i)
{
*(buf + size) = static_cast<int>(i); // or (int)i in C
}
}
int main()
{
int buf[ 6 ];
func(buf, 6);
}
В коде a
является указателем на память. a + 5
означает адрес 5 "ints", откуда a
баллов. Поскольку a
было указано на одно целое число b
, никаких гарантий относительно такого адреса нет. Интересно отметить, что он определенно относится к a+1
, хотя он указывает на место в памяти, которое вы не должны читать или писать. Но сам указатель имеет некоторые гарантии, то есть он будет больше a
, и если вы вычтете 1 из него, вы вернетесь к a
, и если вы сделаете ptrdiff между ним и a
, вы получите 1. Но это просто специальное свойство «один за другим», который позволяет программистам указывать диапазоны памяти.
Что не должен работать обращается к +5 – CashCow
Я думаю, что он/она путает арифметику указателей. –
a просто указывает на ячейку памяти b. Почему вы думаете, что это не должно работать? (a + 5), скорее всего, будет топать в некоторой памяти, но в противном случае я не вижу проблемы. – PixelCloudSt