Ошибка при попытке доступа к структуре с помощью указателей - PullRequest
0 голосов
/ 25 февраля 2019
struct cars {
   char  color[50];
   int maxSpeed;
   float consumption;
};


int main() 
{
  struct cars car1;
  struct cars car2;
  struct cars * car3;

  //Car 1
  strcpy( car1.color, "red");
  car1.maxSpeed = 140;
  car1.consumption = 6.6;

  //Car 2
  strcpy( car2.color, "blue");
  car2.maxSpeed = 150;
  car2.consumption = 7.3;

  //Car 3
  strcpy( car3->color, "green");
  car3->maxSpeed = 145;
  car3->consumption = 7.0;

  return 0;
}

код обычно компилируется как: gcc -std = c99 .....

, но когда я выполняю ошибку обратной сегментации

кажется, что структура не выделена или яполучить доступ к сооружению ненадлежащим образом.

Ответы [ 2 ]

0 голосов
/ 25 февраля 2019

Указатель car3 не был установлен, чтобы указывать на что-либо, поэтому его значение является неопределенным.Когда вы затем попытаетесь прочитать это недопустимое значение и разыменовать его как указатель, вы вызываете неопределенное поведение , которое в этом случае приводит к сбою вашего кода.

Вы можете указать car3 насуществующий экземпляр структуры:

car3 = &car2;

В этом случае, пройдя car3, вы получите именно то, что хранится в car2.Или вы можете динамически распределять память для car3, чтобы указывать на:

car3 = malloc(sizeof *car3);

Затем убедитесь, что free(car3), когда вы закончите, используя его.

0 голосов
/ 25 февраля 2019

Вам необходимо добавить эту строку:

car3 = malloc(sizeof *car3);

Это выделяет память для одного экземпляра автомобиля.

...