2016-09-13 3 views
2

Я считаю, что в объявлении массива, мы не можем указать размер его как этогоПочему int c [0] разрешен в C++?

int a[0]; 

Я знаю, массив пустого размера незаконен в C++, но в моем коде, пустой составитель массив допустимого размера и дать выход.

Мой код здесь:

#include <iostream> 
using namespace std; 

int main() 
{ 
     int a[0]; 

     a[0] = 10; 
     a[1] = 20; 

     cout<<a[0]<<endl; 
     cout<<a[1]<<endl; 

     return 0; 
} 

Выход:

10 
20 

Интернет ссылка составитель: http://code.geeksforgeeks.org/TteOmO

Итак, мой вопрос, Почему int a[0] разрешено GCC компилятор?

+0

Выполнение 'int a [0]; a [0] = 10; a [1] = 20; 'приведет к FireWorks (UB). – sameerkn

+1

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

+0

'ошибка: ISO C++ запрещает массив нулевого размера 'a' [-Wpedantic] int a [0];' – Praveen

ответ

0

Пожалуйста смотреть на это

What happens if I define a 0-size array in C/C++? Если это хороший компилятор будет ловить, что и дать предупреждение. но с педантичной опцией компилятор может его поймать.

0

Не допускается. Это undefined поведение.

Возможно, в вашем примере программа будет использовать память в стеке, которая лежит перед вашей текущей позицией. Он будет обнаружен MemorySanitizer, и если вы смещаете более 2 байтов, вы в конечном итоге перезаписываете обратный адрес. Это приведет к coredump.

5

Он выдает предупреждение, например, лязг выходов:

warning: zero size arrays are an extension [-Wzero-length-array] 

это неопределенное поведение:

a[0] = 10; 
    a[1] = 20; 

нулевой длины массивы расширения для GCC, почему - вы можете прочитать на нем здесь:

https://gcc.gnu.org/onlinedocs/gcc/Zero-Length.html

They are very useful as the last element of a structure that is really a header for a variable-length object:

Это на самом деле расширение C, но похоже, что оно также используется в C++, возможно, для упрощения использования существующих структур из C, который использует это расширение.

+0

Также комментируйте, что более портативное решение для этого типа структур представляет собой массив без размера, например 'a []'. Это добавлено в C99: http://stackoverflow.com/a/17185530/3742943 – LoPiTaL

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