Re: вопрос по языку C
On Thu, 2 Jul 2015, Maxim Sakharov wrote:
Здравствуйте!
Есть ли специалисты по Си? Сын изучает язык, я ему помогаю. Вопрос такой: во
вложенной программе строка s2 описана как массив символов длиной 20, а я могу
обратиться к подстроке этой строки, начинающейся с 22-го символа. Это
нормально или компилятор должен ловить такие ситуации? У меня Debian
GNU/Linux 7, компилятор gcc 4.7.2.
Лучше такие вопросы хотя бы с псевдо-примерами обсуждать.
Скажем так:
void fun() {
char txt[20] = "abcdef";
printf("txt[22] = %c\n",txt[22]);
}
В стандарте языка C вызов txt[22] описывается как неопределенное
поведение, но редко какой компилятор проверяет это условие.
gcc обычно молчит, clang выдает предупреждение:
> clang test_test.c
test_test.c:9:27: warning: array index 22 is past the end of the array (which
contains 20 elements) [-Warray-bounds]
printf("txt[22] = %c\n",txt[22]);
^ ~~
Использовать, естественно, не рекомендуется.
Тем не менее, на практике, порой такие штучки встречаются:
void fun2() {
char txt[2][3] = { "ab",
"AB" };
printf("txt[0][4] = %c\n",txt[0][4]);
}
Хотя с точки зрения стандарта 4 в txt[0][4] тоже выход за пределы
допустимых значений и поведение тоже не гарантировано, однако
"txt[0][4] = B" будет напечатано, по моему, с любым компилятором.
Так что короткий ответ - это нормально ровно в той мере, как
подсказывает совесть разработчика.
Успехов.
Ю.
Reply to: