Re: вопрос по языку C
Maxim Sakharov -> debian-russian@lists.debian.org @ Thu, 02 Jul 2015 23:31:19 +0700:
MS> Есть ли специалисты по Си? Сын изучает язык, я ему помогаю. Вопрос такой: во
MS> вложенной программе строка s2 описана как массив символов длиной 20, а я могу
MS> обратиться к подстроке этой строки, начинающейся с 22-го символа. Это
MS> нормально или компилятор должен ловить такие ситуации? У меня Debian GNU/Linux
MS> 7, компилятор gcc 4.7.2.
С точки зрения стандарта C, это нормально. В C по стандарту обращение к
элементу массива - это всего лишь адресная арифметика, без каких-либо
дополнительных проверок. Компилятор может, если ситуация очевидная,
распознать такую ошибку и выдать предупреждение, но это не запрещенное
действие.
Чисто в теории стандарт, наверное, допускает дополнительные проверки
перед арифметикой, если обращение идет именно как к элементу массива, но
на практике никто так не делает. Сгенерированный машинный код точно не
будет содержать таких проверок.
Меня, кстати, в этом коде куда больше смущает обращение &s1. Вместо
положенного s1. И это, в отличие от выхода за границу, gcc с -Wall
рассказывает. В данном случае, из-за некоторой корявости стандарта,
результат, вероятно, одинаковый, но стоит заменить там массив на
указатель, наступим на грабли.
Reply to: