Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
Форум программистов > C/C++: Для новичков > нулевой размер массива? |
Автор: georain 1.2.2008, 11:41 | ||||
Пишу
выводит 0! Пишу
Выводит 123! Что такое, куда 4 байта делись? |
Автор: Lazin 1.2.2008, 11:46 |
это что, С++? в С/С++ массив нулевого размера объявить нельзя, этим даже пользуются для проверки условий на этапе компиляции Добавлено через 2 минуты и 11 секунд опять-же не должен он выводить 0, p - не должно быть нулевого размера |
Автор: MAKCim 1.2.2008, 11:54 | ||||
georain, типичное переполнение буфера программа нормально завершается? если нормально, этому тоже есть объяснение вот, к примеру код
в данном случае изменяется 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
|
Автор: georain 1.2.2008, 12:05 |
Что-то я ничего не понимаю, всю жизнь считал что в си массивы индексируются с нуля, и в массиве a[100], 101 элемент. |
Автор: MAKCim 1.2.2008, 12:07 | ||
100 - это количество элементов индексация начинается с нуля ну и как тут может быть 101 элемент? ![]() |
Автор: georain 1.2.2008, 12:09 | ||
Так icc точно также компилит, уж intel то IMHO лучше всех должен придерживаться стандартов. Может какие тонкости есть? Добавлено через 2 минуты и 14 секунд
a[0] - первый элемент a[1] - второй элемент ... a[100] - сто первый элемент, разве нет? |
Автор: Maka6er 1.2.2008, 12:16 | ||
Правильно, но a[100] выделяет память на 100 элементов с 0 по 99 |
Автор: Fazil6 1.2.2008, 12:19 |
ну так это тогда массив a[101] , а не a[100]. Не путай размер массива и максимальный индекс элемента |
Автор: georain 1.2.2008, 12:23 |
О ё моё. Сорру. Спасибо. |
Автор: TeAnton 2.2.2008, 18:28 |
georain, в С/С++ нет проверки на границы массивов. Можешь написать хоть: p.a[10000]=123. Запишется неизвестно куда, а скорее всего выскочит ошибка сегментации памяти. |