Модераторы: bsa
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> нулевой размер массива? 
V
    Опции темы
georain
  Дата 1.2.2008, 11:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 193
Регистрация: 28.11.2006
Где: Санкт-Петербург

Репутация: нет
Всего: нет



Пишу
Код

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

выводит 0!

Пишу
Код

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

Выводит 123!

Что такое, куда 4 байта делись?
PM MAIL   Вверх
Lazin
Дата 1.2.2008, 11:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 3820
Регистрация: 11.12.2006
Где: paranoid oil empi re

Репутация: 27
Всего: 154



это что, С++?

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

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

опять-же не должен он выводить 0, p - не должно быть нулевого размера
PM MAIL Skype GTalk   Вверх
MAKCim
Дата 1.2.2008, 11:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Воін дZэна
****


Профиль
Группа: Экс. модератор
Сообщений: 5644
Регистрация: 10.12.2005
Где: Менск, РБ

Репутация: 2
Всего: 207



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 (или восстанавливает его значение из другого источника), поэтому программа не падает


--------------------
Ах, у елі, ах, у ёлкі, ах, у елі злыя волкі ©

PM MAIL   Вверх
Maka6er
Дата 1.2.2008, 11:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 150
Регистрация: 27.2.2007
Где: Киев

Репутация: 1
Всего: 3



Тут неопределенность возникает, это уже от компилятора зависит что выведет. У меня на 1-й пример выводит 1 в VS2005.
PM MAIL   Вверх
georain
Дата 1.2.2008, 11:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 193
Регистрация: 28.11.2006
Где: Санкт-Петербург

Репутация: нет
Всего: нет



У меня так спокойно компилят и выполняют gcc(g++) 4.1 и icc(icpc) 10.0

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

struct{
    int a[100];
} p;


Это сообщение отредактировал(а) georain - 1.2.2008, 12:13
PM MAIL   Вверх
MAKCim
Дата 1.2.2008, 11:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Воін дZэна
****


Профиль
Группа: Экс. модератор
Сообщений: 5644
Регистрация: 10.12.2005
Где: Менск, РБ

Репутация: 2
Всего: 207



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

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

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

все верно


--------------------
Ах, у елі, ах, у ёлкі, ах, у елі злыя волкі ©

PM MAIL   Вверх
georain
Дата 1.2.2008, 12:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 193
Регистрация: 28.11.2006
Где: Санкт-Петербург

Репутация: нет
Всего: нет



Что-то я ничего не понимаю, всю жизнь считал что в си массивы индексируются с нуля, и в массиве a[100], 101 элемент.
PM MAIL   Вверх
MAKCim
Дата 1.2.2008, 12:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Воін дZэна
****


Профиль
Группа: Экс. модератор
Сообщений: 5644
Регистрация: 10.12.2005
Где: Менск, РБ

Репутация: 2
Всего: 207



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

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


--------------------
Ах, у елі, ах, у ёлкі, ах, у елі злыя волкі ©

PM MAIL   Вверх
georain
Дата 1.2.2008, 12:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 193
Регистрация: 28.11.2006
Где: Санкт-Петербург

Репутация: нет
Всего: нет



Цитата(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] - сто первый элемент,

разве нет?
PM MAIL   Вверх
Maka6er
Дата 1.2.2008, 12:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 150
Регистрация: 27.2.2007
Где: Киев

Репутация: 1
Всего: 3



Цитата

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


Правильно, но a[100] выделяет память на 100 элементов с 0 по 99
PM MAIL   Вверх
Fazil6
Дата 1.2.2008, 12:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1653
Регистрация: 3.5.2006
Где: Минск

Репутация: 7
Всего: 60



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

ну так это тогда массив a[101] , а не a[100]. Не путай размер массива и максимальный индекс элемента
PM MAIL   Вверх
georain
  Дата 1.2.2008, 12:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 193
Регистрация: 28.11.2006
Где: Санкт-Петербург

Репутация: нет
Всего: нет



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

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

Это сообщение отредактировал(а) georain - 19.2.2009, 16:22
PM MAIL   Вверх
TeAnton
Дата 2.2.2008, 18:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 40
Регистрация: 5.7.2007

Репутация: нет
Всего: нет



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

PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "C/C++: Для новичков"
JackYF
bsa

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, JackYF, bsa.

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Для новичков | Следующая тема »


 




[ Время генерации скрипта: 0.0740 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.