Следующая программа C создает массив с фиксированным числом элементов. Даже когда мы назначаем еще три значения, которые превышают количество элементов максимального массива, отлично работают.Инициализация массивов в C
#include <stdio.h>
int main(){
//declares a fixed sized array
int balance[5];
//initializing
balance[0] = 1;
balance[1] = 2;
balance[2] = 3;
balance[3] = 4;
balance[4] = 5;
//three more
balance[5] = 6;
balance[6] = 7;
balance[7] = 8;
printf("%d \n", balance[0]);
printf("%d \n", balance[1]);
printf("%d \n", balance[2]);
printf("%d \n", balance[3]);
printf("%d \n", balance[4]);
printf("%d \n", balance[5]);
printf("%d \n", balance[7]);
//and it works fine!
return 0;
}
Но когда мы пытаемся присвоить более чем три элемента он вызывает исключение
#include <stdio.h>
int main(){
//declares a fixed sized array
int balance[5];
//initializing
balance[0] = 1;
balance[1] = 2;
balance[2] = 3;
balance[3] = 4;
balance[4] = 5;
//three more
balance[5] = 6;
balance[6] = 7;
balance[7] = 8;
//one more again
balance[8] = 9;
printf("%d \n", balance[0]);
printf("%d \n", balance[1]);
printf("%d \n", balance[2]);
printf("%d \n", balance[3]);
printf("%d \n", balance[4]);
printf("%d \n", balance[5]);
printf("%d \n", balance[7]);
printf("%d \n", balance[8]);
//throws an exception!
return 0;
}
Но после объявления и инициализации массива с помощью целочисленных литералов можно вставить несколько элементов, не получая ошибку.
#include <stdio.h>
int main(){
//declares and initialize a fixed sized array
int balance[5] = {1,2,3,4,5};
//let's add few more
balance[5] = 6;
balance[6] = 7;
//and even more
balance[7] = 8;
balance[8] = 9;
balance[9] = 10;
printf("%d \n", balance[0]);
printf("%d \n", balance[1]);
printf("%d \n", balance[2]);
printf("%d \n", balance[3]);
printf("%d \n", balance[4]);
printf("%d \n", balance[5]);
printf("%d \n", balance[6]);
printf("%d \n", balance[7]);
printf("%d \n", balance[8]);
printf("%d \n", balance[9]);
//and it works fine!
return 0;
}
В чем причина такого поведения языка C?
Неопределенное поведение –
Причина в том, что все утверждения, которые используют элементы доступа «a [5]» и «за», являются неопределенным поведением, что не является гарантией отказа. Перестаньте пытаться выяснить, как далеко вы можете пойти и научиться распознавать и избегать подобных случаев. –
Что значит «выкидывает исключение» * ?? Может быть, вы компилируете C-код с помощью компилятора C++? – pmg