Инициализация пустого массива в C ++ - PullRequest
0 голосов
/ 31 марта 2012

Я пишу программу на C ++, и мне нужно инициализировать массив созданного мной объекта struct. Это выглядит примерно так:

typedef struct {
float x;
float y;
} vec2;

И затем я инициализирую массив следующим образом:

vec2 hotSpot[1000];

Я думал, что когда я инициализирую такой массив, он будет полностью пустым, но когда я печатаю значение sizeof (hotSpot), оно говорит 8000!

Я где-то ошибаюсь или неправильно понял какую-то концепцию? Как сделать этот массив пустым?

Ответы [ 6 ]

6 голосов
/ 31 марта 2012

Ваш массив не является и никогда не может быть "пустым". Он имеет и будет всегда иметь 1000 элементов. Такова природа массивов C ++.

Проблема в том, что эти элементы не находятся в каком-либо детерминированном состоянии, и действительно доступ к любому элементу, который не был инициализирован, является неопределенным поведением .

В более общем смысле объекты в C ++ никогда не могут быть "пустыми". Они всегда существуют. Если бы объект не существовал, не было бы объекта. Некоторые объекты всегда существуют в определенном состоянии, в то время как другие объекты (такие как примитивные типы или именованный объект после std::move d) могут существовать в неинициализированном или неопределенном состоянии - они все еще существуют, но это единственное, что вы ' присваивают значение для них.

2 голосов
/ 31 марта 2012

Ваш hotSpot не может быть пустым, так как вы инициализировали его как массив из 1000. Там для 1000 элементов.

Когда происходит vec2 hotSpot[1000];, он помещает все 1000 значений как * 1005.* неинициализированная переменная.

Элементы в hotSpot недопустимы, поскольку они не были инициализированы.Если вы хотите установить их все на ноль, вы можете использовать memset , чтобы инициализировать их все на ноль.

Для получения дополнительной информации о массивах, пожалуйста, посмотрите на эту ссылку.

0 голосов
/ 17 мая 2013

Пожалуйста, дайте название вашей структуре.Имя, указанное после скобок, является именем объекта, а не именем класса / Struct

0 голосов
/ 31 марта 2012

Число с плавающей запятой на вашем компьютере составляет всего 4 байта. При инициализации hotSpot занимает всего 8000.

0 голосов
/ 31 марта 2012

Я предполагаю, что вы хотите инициализировать ваш «пустой» массив следующим образом:

vec2 hotSpot[]; // Defines an array of undefined length

Но если вы хотите инициализировать его как «пустой», то есть заполнить весь его контент нулями:

vec2 hotSpot[1000]; // Defines an array of 1000 items in length
memset(hotSpot, 0, sizeof(hotSpot)); // Fill the array with zeros
0 голосов
/ 31 марта 2012

они пусты для данных, но память выделена для хранения 1000 * 2 с плавающей точкой * 4 байта

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...