#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];
Исправлено за вас.