2D массив с переменным вторым измерением: исследование обработки компилятором

#arrays #c

#массивы #c

Вопрос:

Я читал, что для многомерных массивов C, за исключением первого измерения, другие размеры массива должны быть фиксированными, т. Е. Связанными с исследованием выше, я написал следующую программу:

 #include<stdio.h>
int main() {  
int N; 
double data2D[4][N]; 
scanf("%d",amp;N);
int i=0,j=0;
for(i=0;i<4;i  )
{
for (j=0;j<N;j  )
   data2D[i][j]=i*N j;
    printf("[%d,%d]n",i,j);       
}

double Number=data2D[3][0];
printf(" the value=%fn",Number);
}
  

Я запустил приведенный выше код и его варианты со значением N, равным 5.

Когда я запустил приведенный выше код, я получил следующий вывод:

 [0,1]
[1,0]
[2,0]
[3,0]
the value=0.000000
  

Когда я переместил scanf перед объявлением массива, я получаю

 [0,5]
[1,5]
[2,5]
[3,5]
 the value=15.000000
[correct!]
  

Используя исходную программу, я переместил «int N;» перед main(), я получаю

 [1104140288,8388609]
 the value=0.000000
  

Есть ли какое-либо объяснение вышесказанному, особенно последним 2? Какое правило указано в начале моего сообщения?

Спасибо

Комментарии:

1. int N; double data2D[4][N]; scanf("%d",amp;N); N Перед определением массива требуется значение. Если вы позже измените значение размера N массива, это не изменится.

2. да, это то, что я прочитал. Но моя программа отлично работала во втором тесте, см. Выше

3. Это то, что я имел в виду. N должно иметь значение, которое вам нужно, прежде чем вы определите массив.

4. Короче говоря, ставьте double строку за scanf строкой. Затем N будет иметь значение, которое data2D будет определено с правильными / желаемыми размерами.

5. @Погода,@Крейг. Спасибо. Я вас полностью понимаю. Не должен ли я много читать о результатах 2 других тестов (что меня больше беспокоило)