как массивы обрабатываются с помощью gcc [вопрос, связанный с программированием на C] - PullRequest
1 голос
/ 02 декабря 2010

Компилируется в gcc без ошибок и предупреждений, даже с опцией -Wall это означает, что границы массива проверяются во время выполнения и, следовательно, компилятор не может обнаружить ошибку

#include<stdio.h>

int main()
{
      int a[2][3][4];

      a[1][2][100] = 4 ;

      return 0;
}

Однако

#include<stdio.h>

int main()
{
      int a[2][3];

      a[1][2][100] = 4 ;

      return 0;
}

это приводит к ошибке при компиляции как:

$ gcc sample.c -Wall
sample.c: In function ‘main’:
sample.c:7: error: subscripted value is neither array nor pointer

Почему это так? в обоих кодах a [1] [2] [100] недопустимо. Тем не менее, как компилятор может обнаружить это code2, а не code1.

Особенно, когда каждый компилятор сводит весь многомерный массив в соответствующие одномерные массивы, как компилятор может выборочно осознавать этот недостаток в коде.

Разъяснения или упоминания о какой-либо книге или статье, где содержится правильное объяснение, будут с благодарностью приняты:)

Ответы [ 3 ]

4 голосов
/ 02 декабря 2010

Разница в типах.C не выполняет проверку границ, но выполняет (статическую) проверку типов.Тип a в вашем первом примере - int[][][], но тип во втором примере - int[][].

Уплощение, на которое вы ссылаетесь, происходит при генерации кода, что (концептуально) после проверки типа.

4 голосов
/ 02 декабря 2010

Во-первых, границы массивов не проверяются во время выполнения или во время компиляции. Будь осторожен там.

Во-вторых, ваш второй случай дает ошибку, потому что у вас есть несоответствие в измерении массива - вы используете три нижних оператора ([]) в двумерном массиве. Тот факт, что массив расположен в памяти как массив массивов, не означает, что с переменной происходит какое-то реальное изменение типа.

Подписка на массив описана в разделе стандарта C 6.5.2.1 Подписка на массив .

2 голосов
/ 02 декабря 2010

С учетом

int a[2][3];

компилятор определит, что a[1][2] имеет тип int. Следовательно, доступ к элементу [100] этого эквивалентен:

int x;
x[100] = 4;

Это даст вам ту же ошибку в отношении подписанного значения.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...