Выделение динамической памяти массиву структур

#c #memory

#c #память

Вопрос:

Я пытаюсь ответить на домашнее задание, которое у меня есть, где мне нужно запросить координаты «n», а затем построить массив координат структуры с таким размером. Каждая структура координат имеет 2 переменные типа double.

Я попытался получить ввод n от пользователя и проверить с помощью оператора if, что сначала оно больше 0, чтобы избежать какого-либо сбоя

 printf("Enter amount of coordinates:n");
scanf_s("%d", amp;n);
if (n > 0) {
    coordinates cordArray = (coordinates *)malloc(cordArray * sizeof(n));
  

}

Ожидается, что после получения значения n от пользователя будет выделен массив structs нужного размера. Я получаю ошибку «Ошибка состояния подавления строки файла проекта Описания кода серьезности (активна) E0415 не существует подходящего конструктора для преобразования из «координат *» в «координаты»

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

1. Указано ли в вашем назначении, что вы должны использовать malloc ? Это старый метод выделения из C. Предпочтительнее использовать C new .

2. Да, мы должны использовать malloc

Ответ №1:

вероятно

 coordinates cordArray = (coordinates *)malloc(cordArray * sizeof(n));
  

необходимо заменить на

 coordinates * cordArray = (coordinates *)malloc(sizeof(coordinates) * n);
  

поскольку вы присваиваете a coordinates с помощью a coordinates * и cordArray неизвестно, и даже это может быть не конвертируемо в a size_t (вы не даете его определения)


Кстати, вы на C , зачем вы используете массив C, вы можете выделить его с помощью new, позволяющего вызывать конструктор координат для каждой записи или лучше использовать std::vector , позволяющий изменять размер, доступ к размеру и т. Д


По поводу ваших замечаний, эта программа компилируется и запускается :

 #include <stdio.h>
#include <stdlib.h>

typedef struct { 
  double x;
  double y;
}coordinates;

int main()
{
  printf("Enter amount of coordinates:n");

  int n;

  if (scanf("%d", amp;n) != 1)
    puts("invalid number");
  else if (n <= 0)
    puts("expected a positive number");
  else {
    coordinates * cordArray = (coordinates *) malloc(sizeof(cordArray) * n);

    if (cordArray == NULL)
      printf("cannot allocate memory, probably %d too largen", n);
    else {
      int i;

      for (i = 0; i < n; i  ) { 
        printf("Please enter coordinates for coordinates #%d:n", i   1);
        if (scanf("%lf%lf", amp;cordArray[i].x, amp;cordArray[i].y) != 2){
          puts("invalid values");
          return -1;
        }
      }
    }
  }
}
  

Обратите внимание, что это код на C, почему вы использовали тег C ?

 pi@raspberrypi:/tmp $ g   -pedantic -Wall -Wextra c.cc
pi@raspberrypi:/tmp $ ./a.out
Enter amount of coordinates:
2
Please enter coordinates for coordinates #1:
1 2
Please enter coordinates for coordinates #2:
3 4
  

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

1. если я могу задать другой вопрос по этому поводу, после того, как я выделил необходимую мне память, мне теперь нужно получить доступ к этому массиву struct в цикле for и получить входные данные для x и y, но я не могу получить доступ к этому cordArray сейчас. Из того, что я прочитал, если я хочу получить доступ к значениям x и y, это должно быть похоже на этот codArray[[i].x / codArray [[i].y но я все равно не могу получить доступ к структуре cordArray.

2. что вы имеете в виду «я не могу получить доступ к этому cordArray сейчас»? после malloc вы можете получить доступ к любой записи в нем

3. @YakirMalka Я не знаю, как coordinates выглядит структура, но, вероятно, это будет что-то вроде cordArray[i].x и cordArray[i].y .

4. @YakirMalka Я отредактировал свой ответ, предупреждая, если координаты не содержатся в integer / float, потому что при использовании malloc конструктор не вызывается для каждого элемента

5. Я объясню еще раз. У меня есть «n» количество координат, которые мне нужно собрать от пользователя в массив структур. Это означает, что после того, как я назначил память выше, теперь мне нужно выполнить до «n» в цикле for и вставить координаты для x и y для каждой структуры в массиве. Итак, насколько я понимаю, у меня цикл for выполняется до «n», это не проблема, после этого мне нужно выполнить сканирование входных данных в x и y,

Ответ №2:

@bruno показал правильный способ выделения памяти с помощью malloc . Однако это можно сделать еще проще с помощью оператора new[] , который автоматически вычисляет объем требуемой памяти.

 coordinates *cordArray = new coordinates[n];
  

Чтобы освободить память, используйте operator delete[] .

 delete[] cordArray;
  

Другим преимуществом способа выделения C является то, что он вызывает конструкторы для вновь созданных объектов. (Если у них есть какие-либо конструкторы, то есть.)

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

1. Я также говорю о новом и конструкторе 😉

2. Мне нужно использовать функцию malloc для динамического выделения памяти, вот назначение: (

3. @YakirMalka Ну, я не должен удивляться. Это нормально, что учителя все еще живут в 20 веке 😉

4. @bruno Извините, это не было помечено как код, и я пропустил это.