【问题标题】:How to store a structure pointer in C so data is not loss?如何在 C 中存储结构指针,以免数据丢失?
【发布时间】:2018-05-08 22:04:27
【问题描述】:

我有这个代码

#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 辆汽车
  2. 那么如何保存*pointerCar to array[3] of pointerCars
  3. 我总共将拥有 15 辆汽车,但每辆汽车将拥有 5 辆汽车

我的问题是,每次我运行代码时,我从最后一辆汽车中写入的数据都会被重写。

【问题讨论】:

  • 首先将pointerCar 指向Cars,然后立即将其分配给malloc 的结果。
  • 如果您想存放多辆汽车,您必须将它们存放在不同的地方。
  • @ChristianGibbons,是的,所以我可以为每个指针拥有 5 辆车
  • 这解释了为什么您将malloc 的结果分配给pointerCar,但Cars 从未发挥作用。您创建它,将某些东西指向它,然后将它指向远离它的东西,再也不要触摸它。

标签: c pointers data-structures structure


【解决方案1】:

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

Autos *pointerCar, Cars; - 不要那样做,它会增加可读性。我假设您想声明两个指针:pointerCar - 用于单辆汽车,cars 用于汽车阵列。在您的代码中,您声明了一个指针 pointerCarvariable Cars

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

Auto *single_car;
Auto *cars;

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

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

现在是问题

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

我总共将拥有 15 辆汽车,但每辆汽车将拥有 5 辆汽车;

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

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

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 辆。

【讨论】:

    【解决方案2】:

    如果您有 5 辆汽车,请声明汽车数组: Auto Cars[5]; 然后将指针汽车依次指向汽车 0 到 4。

    【讨论】:

      【解决方案3】:

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

      Autos *pointerCar;
      

      该指针可用于存储一种 Autos 类型结构的地址。可以这样取数组。

      Autos *pointerCar[number_of_cars];
      

      对于第i辆车,通过malloc分配第i个指针

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

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2012-04-09
        • 2019-07-01
        • 1970-01-01
        • 2020-06-13
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多