Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Для новичков > нулевой размер массива?


Автор: georain 1.2.2008, 11:41
Пишу
Код

struct{
    int a[0];
} p;
cout << sizeof(p);

выводит 0!

Пишу
Код

p.a[0] = 123;
cout << p.a[0];

Выводит 123!

Что такое, куда 4 байта делись?

Автор: Lazin 1.2.2008, 11:46
это что, С++?

в С/С++ массив нулевого размера объявить нельзя, этим даже пользуются для проверки условий на этапе компиляции

Добавлено через 2 минуты и 11 секунд
Цитата(georain @  1.2.2008,  11:41 Найти цитируемый пост)
выводит 0!

опять-же не должен он выводить 0, p - не должно быть нулевого размера

Автор: MAKCim 1.2.2008, 11:54
georain
типичное переполнение буфера
программа нормально завершается?
если нормально, этому тоже есть объяснение
вот, к примеру код
Код

int main() {
    struct {
        int a[0];
    } p;
    p.a[0] = 123;
    return 0;
}

Код

main:
.LFB2:
    pushq   %rbp
.LCFI0:
    movq    %rsp, %rbp
.LCFI1:
    movl    $123, 0(%rbp)
    leave
    ret

в данном случае изменяется rbp в стеке, а через leave идет его загрузка
вполне возможно, что функция окружения, вызвавшая main, не использует rbp (или восстанавливает его значение из другого источника), поэтому программа не падает

Автор: Maka6er 1.2.2008, 11:55
Тут неопределенность возникает, это уже от компилятора зависит что выведет. У меня на 1-й пример выводит 1 в VS2005.

Автор: georain 1.2.2008, 11:57
У меня так спокойно компилят и выполняют gcc(g++) 4.1 и icc(icpc) 10.0

Причём размер такой структуры 400 
Код

struct{
    int a[100];
} p;

Автор: MAKCim 1.2.2008, 11:59
Цитата(Lazin @  1.2.2008,  11:46 Найти цитируемый пост)
опять-же не должен он выводить 0, p - не должно быть нулевого размера 

возможно, используется GNU расширение

Добавлено через 49 секунд
Цитата(georain @  1.2.2008,  11:57 Найти цитируемый пост)
Причём размер такой структуры 400 

все верно

Автор: georain 1.2.2008, 12:05
Что-то я ничего не понимаю, всю жизнь считал что в си массивы индексируются с нуля, и в массиве a[100], 101 элемент.

Автор: MAKCim 1.2.2008, 12:07
Цитата(georain @  1.2.2008,  12:05 Найти цитируемый пост)
Что-то я ничего не понимаю, всю жизнь считал что в си массивы индексируются с нуля, и в массиве a[100], 101 элемент. 

100 - это количество элементов
индексация начинается с нуля
ну и как тут может быть 101 элемент?  smile 

Автор: georain 1.2.2008, 12:09
Цитата(Lazin @  1.2.2008,  11:46 Найти цитируемый пост)

возможно, используется GNU расширение

Так icc точно также компилит, уж intel то IMHO лучше всех должен придерживаться стандартов.

Может какие тонкости есть?

Добавлено через 2 минуты и 14 секунд
Цитата(MAKCim @  1.2.2008,  12:07 Найти цитируемый пост)
100 - это количество элементов
индексация начинается с нуля
ну и как тут может быть 101 элемент? 

a[0] - первый элемент
a[1] - второй элемент
...
a[100] - сто первый элемент,

разве нет?

Автор: Maka6er 1.2.2008, 12:16
Цитата

a[0] - первый элемент
a[1] - второй элемент
...
a[100] - сто первый элемент


Правильно, но a[100] выделяет память на 100 элементов с 0 по 99

Автор: Fazil6 1.2.2008, 12:19
Цитата(georain @  1.2.2008,  11:09 Найти цитируемый пост)
разве нет?

ну так это тогда массив a[101] , а не a[100]. Не путай размер массива и максимальный индекс элемента

Автор: georain 1.2.2008, 12:23
Цитата(Maka6er @  1.2.2008,  12:16 Найти цитируемый пост)
Правильно, но a[100] выделяет память на 100 элементов с 0 по 99 

О ё моё. Сорру. Спасибо.

Автор: TeAnton 2.2.2008, 18:28
georain, в С/С++ нет проверки на границы массивов. Можешь написать хоть: p.a[10000]=123. Запишется неизвестно куда, а скорее всего выскочит ошибка сегментации памяти. 

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)