Size: a a a

2021 March 14

P

Ponytale 🇷🇺 in pro.cxx
еще раз: N-мерные массивы по M элементов в си плюсах равно как и в си без плюсов располагаются линейно в памяти, занимая N*M*sizeof(array_type) байт?
источник

P

Ponytale 🇷🇺 in pro.cxx
вот где что-то может пойти не так?!
источник

RP

Roman Proskuryakov in pro.cxx
Ponytale 🇷🇺
еще раз: N-мерные массивы по M элементов в си плюсах равно как и в си без плюсов располагаются линейно в памяти, занимая N*M*sizeof(array_type) байт?
все верно. а теперь почитай статью
источник

P

Ponytale 🇷🇺 in pro.cxx
Roman Proskuryakov
все верно. а теперь почитай статью
не хочу)
источник

RP

Roman Proskuryakov in pro.cxx
ты не можешь обращаться к корректно аллоцированной памяти через невалидный указатель
источник

A

Anton in pro.cxx
Ponytale 🇷🇺
еще раз: N-мерные массивы по M элементов в си плюсах равно как и в си без плюсов располагаются линейно в памяти, занимая N*M*sizeof(array_type) байт?
никто не гарантирует, что инкремент указателя внутри массива и между массивами - это одно и тоже
источник

RP

Roman Proskuryakov in pro.cxx
невалидный в данном случае - array + i
источник

P

Ponytale 🇷🇺 in pro.cxx
Roman Proskuryakov
ты не можешь обращаться к корректно аллоцированной памяти через невалидный указатель
если у разрабов сей были еще лечимые проявления шизофрении, то у си плюсников они уже переросли в клинику)
источник

P

Ponytale 🇷🇺 in pro.cxx
если все так плохо как вы описываете)
источник

RP

Roman Proskuryakov in pro.cxx
единственное исключение - указатель на "законец" массива, чтобы вы могли проверять всякие std::end
источник

RP

Roman Proskuryakov in pro.cxx
да я вообще на расте пишу
источник

RP

Roman Proskuryakov in pro.cxx
не приписывайте мне свои С и С++ болезни)
источник

IA

Ilia Abernikhin in pro.cxx
Vlad Serebrennikov
еще раз: поведение кода, который вы написали, в стандарте определено сложнее, чем вы себе представляете
я не претендую на експерта по знанию стандарта но существует банальная цепочка россуждений которая и приводит меня к моему представлению:
1) елементы массивов идут последовательно даже если елементом масива выступает масив
2) прибавление числа к указателю на некоторый тип смешает указатель на это число
3) разыменование указателя указываюшего на кусок памяти выделеный под вашу програму ub вызвать не способно по определению

что мы имеем с точки зрения компилятора в foo перебор некоторых указателей, на легальной области памяти, да формально мы вышли за пределы масива, он должен состоять из 5ти елементов, но дальше идет память точно так же принадлежащая нам, и компилятор не имеет ничего против, он не анализирует как ты пришел к этому адресу, его волнует только принодлежит эта память тебе или нет, а память принадлижит тебе (смотри пункт первый) так что array + i, ошибка только И ТОЛЬКО логического характера...
источник

IL

Ignat Loskutov in pro.cxx
я как-то слышал о каком-то strict aliasing rule...
источник

P

Ponytale 🇷🇺 in pro.cxx
Roman Proskuryakov
не приписывайте мне свои С и С++ болезни)
не не это не тебе вообще)

это я ворчу прст
источник

ПК

Побитый Кирпич... in pro.cxx
Ilia Abernikhin
я не претендую на експерта по знанию стандарта но существует банальная цепочка россуждений которая и приводит меня к моему представлению:
1) елементы массивов идут последовательно даже если елементом масива выступает масив
2) прибавление числа к указателю на некоторый тип смешает указатель на это число
3) разыменование указателя указываюшего на кусок памяти выделеный под вашу програму ub вызвать не способно по определению

что мы имеем с точки зрения компилятора в foo перебор некоторых указателей, на легальной области памяти, да формально мы вышли за пределы масива, он должен состоять из 5ти елементов, но дальше идет память точно так же принадлежащая нам, и компилятор не имеет ничего против, он не анализирует как ты пришел к этому адресу, его волнует только принодлежит эта память тебе или нет, а память принадлижит тебе (смотри пункт первый) так что array + i, ошибка только И ТОЛЬКО логического характера...
>  разыменование указателя указываюшего на кусок памяти выделеный под вашу програму ub вызвать не способно по определению

Нет такого определения
источник

P

Ponytale 🇷🇺 in pro.cxx
Ilia Abernikhin
я не претендую на експерта по знанию стандарта но существует банальная цепочка россуждений которая и приводит меня к моему представлению:
1) елементы массивов идут последовательно даже если елементом масива выступает масив
2) прибавление числа к указателю на некоторый тип смешает указатель на это число
3) разыменование указателя указываюшего на кусок памяти выделеный под вашу програму ub вызвать не способно по определению

что мы имеем с точки зрения компилятора в foo перебор некоторых указателей, на легальной области памяти, да формально мы вышли за пределы масива, он должен состоять из 5ти елементов, но дальше идет память точно так же принадлежащая нам, и компилятор не имеет ничего против, он не анализирует как ты пришел к этому адресу, его волнует только принодлежит эта память тебе или нет, а память принадлижит тебе (смотри пункт первый) так что array + i, ошибка только И ТОЛЬКО логического характера...
+
источник

S

Stepan in pro.cxx
Andrey Glebov
Тут получается out-of-bounds array access:
(array + i) не валидно если i > N, где N - размер массива.
какого массива? того, что получился в выражении array[0]
а это массив типа int[5]
Невалид i ≥ N, т.к последний элемент будет иметь индекс N - 1.
{0, 1, 2, 3, 4} => N = 5
Элемента с индексом 5 не существует.
источник

VS

Vlad Serebrennikov in pro.cxx
Stepan
Невалид i ≥ N, т.к последний элемент будет иметь индекс N - 1.
{0, 1, 2, 3, 4} => N = 5
Элемента с индексом 5 не существует.
но вычислить указатель на него можно
источник

A

Anton in pro.cxx
Vlad Serebrennikov
но вычислить указатель на него можно
нельзя
источник