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

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: