Comments 14
Ин Совет Раша программисты не только говнокодят, но и пишут об этом статьи на хабре.
1, 2, 4 и 5 случай как-то ещё можно понять и простить, но случай три…
1, 2, 4 и 5 случай как-то ещё можно понять и простить, но случай три…
-14
С таким же успехом можно было просто рандомное число в указатель записать.
0
Это разные вещи. Тут ptr3 является указателем, про который стандарт говорит, что он «points one past the last element of the array object» (или «past the end of the array» в других местах). Такие указатели нельзя разименовывать, но они могут быть использованы для вычисления размеров (
end - begin
) либо как граница массива (p != end
). Исходя из этого имеет смысл рассматривать их как отдельный случай в контексте данной статьи, а не просто как «рандомное число в указателе».+2
Т.е. malloc не может выделить байт, следующий за уже выделенным куском памяти?
0
Вполне себе может, к этому байту же не должно быть обращения от массива, для которого он находится за границей. В таком случае один и тот же указатель для разных массивов просто будет играть различную роль. Но это такой крайний случай, про «нельзя разименовывать» это в целом, так как там может быть что-то, а может и не быть (в этом случае ничего ошибочного ведь не произойдёт, поэтому ограничений на реализацию не возникает, требования только послабляются). Но компиляторы, вполне могут расчитывать, что такой указатель не будет разименовываться, когда видят, что он указывает за массив.
0
Какой раша? перевод же!
+6
Флажок перевода такой неприметный… Прошу прощения, исправляюсь:
Ин Совет Раша не только переводят пиндостанские статьи о говнокоде, но и пишут об этом статьи на хабре.
Ин Совет Раша не только переводят пиндостанские статьи о говнокоде, но и пишут об этом статьи на хабре.
-20
Перевод: tedu
В оформлении косяки: выглядит, будто переводчик tedu, а автор SLY_G.
+1
Сразу прошу простить, если я нарушу чувство гармонии тех, кто знает стандарт наизусть, но вот вывод gcc 4.9 на 5-й случай:
main.c:2:6: warning: array ‘a’ assumed to have one element
char a[];
Значит ли это, что gcc отступает от стандарта в данном месте?
P.S.: При этом sizeof(a) не компилится с ошибкой, что тип недоопределен.
main.c:2:6: warning: array ‘a’ assumed to have one element
char a[];
Значит ли это, что gcc отступает от стандарта в данном месте?
P.S.: При этом sizeof(a) не компилится с ошибкой, что тип недоопределен.
0
Это связано с типом видимости и недоопределённостью символа, там даже пример такой приводится (C99, 6.9.2):
EXAMPLE 2 If at the end of the translation unit containingТак что GCC скорее сообщает о том, что реально происходит, так как это может быть следствием ошибки программиста (если добавить
int i[];
the array i still has incomplete type, the implicit initializer causes it to have one element, which is set to zero on program startup.
static
или extern
, то поведение более очевидное и предупреждение пропадает). Вообще, добавляйте флаг -pedantic
, если хотите отключить расширения GNU-C и получить больше предупреждений об отклонении от буквы стандарта.+1
Открыл для себя слово надоедят, богат и могуч…
+1
Sign up to leave a comment.
Объекты нулевого размера