[Date Prev][Date Next] [Thread Prev][Thread Next] [Date Index] [Thread Index]

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: