如何在C中存储结构指针,这样数据不会丢失?

时间:2018-05-08 22:04:27

标签: c pointers data-structures structure

我有这段代码

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

typedef struct {
  char   brand[40];
  int    year;
  int    km;
  float  price;
}Autos;

int userInput;
void menu();
void scanCars(Autos *pointer);
void print_struct(Autos *pointer);


int main(int argc, char const *argv[])
{
  Autos *pointerCar, Cars;
  pointerCar=&Cars;
  pointerCar=(Autos  *)malloc(5*sizeof(Autos));
  int value= 1;
    while (value)
    {
    menu();
      switch (userInput)
      {
        case 1:
         scanCars(pointerCar);

          break;
        case 2:
          print_struct(pointerCar);

          break;
        case 3:
          value=0;
          break;
      }

    }
  free(pointerCar);
  return 0;
}
void menu()
{
    printf("1) Input Cars:\n" );
    printf("2) Print Cars:\n" );
    printf("3) Exit\n" );
    scanf("%d", &userInput );
    printf("=================\n" );
}
void scanCars(Autos *pointer)
{
  printf("1) Scanning CARS:\n");
  for (int i = 0; i < 2; i++)
  {
    printf("Brand:");
    scanf("%s", (pointer+i)->brand);

    printf("Year: ");
    scanf("%d", &(pointer+i)->year );

    printf("Kilometros:");
    scanf("%d",&(pointer+i)->km );

    printf("price: ");
    scanf("%f",&(pointer+i)->price );
  }
    printf("=================\n" );

}
void print_struct(Autos *pointer)
{
  for (int i = 0; i < 3; i++)
  {
    printf("Car #[%d]\n",i+1 );
    printf("Brand: %s\n",(pointer+i)->brand);
    printf("Year: %d\n",(pointer+i)->year );
    printf("Kilometraje: %d\n",(pointer+i)->km );
    printf("Price: $%.2f\n",(pointer+i)->price );
    printf("=================\n" );
  }

}

代码运行正常,可存储一些汽车数据,然后在询问时打印出来。

问题:

当我第二次尝试存储新车数据时,我丢失了最后一次输入。所以我的问题是如何存储新的结构数组并打印整个数据:

实施例

  1. 每个*pointerCar有5个CARS
  2. 所以如何保存*pointerCar to array[3] of pointerCars
  3. 我将在TOTAL共有15辆车,但每辆AUTOS将有5辆CARS
  4. 我的问题是,每次我运行代码时,我从最后一辆汽车上写下的数据都会被重写。 Image for Input Cars Image for Printing Cars
    enter image description here

3 个答案:

答案 0 :(得分:1)

首先,要避免一些事情使代码更易读,更容易调试:

Autos *pointerCar, Cars; - 不要这样做,这会加剧可读性。我假设您要声明两个指针:pointerCar - 对于单个车辆,cars表示一系列车辆。在您的代码中,您已声明指针pointerCar变量 Cars

建立一个命名约定并坚持下去。如果您对类型使用CamelCase,请不要将其用于变量(请改用camelCase或snake_case)。不要使用复数类型。我会这样写:

Auto *single_car;
Auto *cars;

使用calloc进行结构和数组初始化,因为它用零填充分配的内存,这很方便。

cars = (Auto*) calloc(5, sizeof(Auto));

现在问题

您丢失了上次输入,因为每次调用scanCars函数时,都会反复传递相同的指针。您的*pointerCar指向5个自动数组,然后用scanCars中的数据填充它并从函数返回。下次调用scanCars时,它会将相同的指针作为参数传递并覆盖数据。

  

我将在TOTAL中共有15辆车,但每辆AUTOS将有5辆CARS;

这里出了点问题。您只定义了一种类型:Autos(应该只是Auto)。如果为5个Autos分配空间,您将获得一个指向内存的指针,该内存已准备好存储5个Auto结构,仅此而已。

如果您想将Autos分组到某种形式的假设车库,您必须创建一个指向Auto的指针表(或简单地说:Autos表格表)。例如:

Auto *garage[3];
garage[0] = (Auto*) calloc(5, sizeof(Auto));
garage[1] = (Auto*) calloc(5, sizeof(Auto));
garage[2] = (Auto*) calloc(5, sizeof(Auto));

现在garage的每个元素都包含一个包含5个Autos的数组。要访问车库中的汽车,您需要写下:garage[1][0].year

现在您可以将车库传递给scanCars功能:scanCars(garage[0])。请记住在scanCars中调整for循环,因为它设置为仅填充2辆车,现在应该有5辆。

答案 1 :(得分:0)

如果您有5辆汽车,请声明汽车阵列: Auto Cars[5];然后你将pointerCar按顺序指向每个0到4的汽车。

答案 2 :(得分:0)

使用指针数组可以很容易地解决这个问题。

Autos *pointerCar;

此指针可用于存储Autos类型的一个结构的地址。你可以像这样使用数组。

Autos *pointerCar[number_of_cars];

对于第i个汽车,将第i个指针分配给malloc为

pointerCar[i]=(Autos  *)malloc(sizeof(Autos));

如果您不了解指针数组,请参阅this