2015-01-17 3 views
0

Ниже мой код в CЯвляются ли обычные массивы динамическими?

main(){ 

    int a[1]; 
    a[0]=10; 
    a[1]=12; 
    printf("%d\n",a[1]); 
    copy_arr(a); 
    printf("%d",a[1]); 
} 

Ниже выход

12 
12 

Не должно дать массив из границы или что-то вроде этого?

Или код выше зависит от компилятора?

Я запускаю вышеуказанное в компиляторе gcc.

+3

'main()' должен быть 'int main (void)', и вам нужно '#include ' вверху. Где определяется 'copy_arr'? –

+0

Компилятор * должен * дать вам предупреждение о том, что доступ к вашему массиву выходит за пределы, и компилятор clang * делает * предупреждает вас. Не знаю, почему gcc нет. – user3386109

+0

С * gcc * обязательно включите предупреждения с флагами компилятора '-Wall -Wextra'. – hyde

ответ

4

Нет автоматической проверки границ массива в C. В вашем коде не определено поведение (UB). Это означает, что иногда это может показаться «работающим». Но вы не можете рассчитывать на какой-либо конкретный результат. Программа с UB является сломанной программой.

3

Доступ к внешней памяти - undefined behaviour. Будьте статически распределены или динамически.

Точка к сведению: C не имеет встроенный функция проверки доступа к граничному диапазону доступа. Итак, вы не будете предупреждены по умолчанию [как вы может ждали].

2
int a[1]; 

Этот массив может просто провести одно целое и действительный доступ a[0], a[1] будет массив из связанного доступа, который является неопределенным behvaior.

+0

@alk Я имел в виду, что результаты не согласуются, и это может иногда срабатывать и иногда не может – Gopi

Смежные вопросы