Создать массив структур, но определить размер позже?

#c #arrays #pointers #struct

#c #массивы #указатели #структура

Вопрос:

Я пытаюсь создать массив структур, но определить его размер позже, вот так:

 struct xy{

int x;
int y;
};

int main(){
    xy pos;
    int size = 10;
    pos = new xy[size];
    pos[0].x = 5;
}
  

Но я не могу заставить это работать, что бы я ни пытался. Также я не хочу использовать вектор для этого, поэтому, пожалуйста, не говорите, что я должен.

Комментарии:

1. «Я не хочу использовать вектор для этого». Поскольку вы просили, чтобы это не предлагалось, я не буду этого предлагать, но спрошу: почему вы не хотите использовать std::vector ?

2. В C вы бы malloc (или, может быть, массивы переменной длины в C99) и free .

3. А для глобальных файлов вы даже можете обойтись без динамической памяти: extern xy pos[]; int const size = 10; xy pos[size];

4. «поэтому, пожалуйста, не говорите, что я должен» Ну, вы должны.

5. Когда существует ограничение на неиспользование STL, это, вероятно, в образовательных целях.

Ответ №1:

new возвращает указатель:

 int main(){
    xy* pos;
    int size = 10;
    pos = new xy[size];
    pos[0].x = 5;
}
  

Комментарии:

1. Причина, по которой код Майкла работает, а ваш нет, заключается в том, что оператор new возвращает указатель на первый элемент выделенной памяти. Поскольку xy — это тип структуры, pos должен быть xy * или указателем на структуру. Таким образом, если вы вызовете pos , компилятор будет знать, сколько байтов нужно пропустить, чтобы pos указывал на следующую структуру в массиве.

2. @pajton: Вообще-то, мне следовало добавить слова «но вы должны использовать вектор». Мне нужно отточить свое остроумие.

3. Я бы добавил delete[] pos перед концом main , по крайней мере, для хорошей практики.

Ответ №2:

 xy* pos = new xy[size];
  

Исправлено за вас.