如何在 C 中使用 Struct 和指针在指针中使用索引
How use index in a pointer with Struct and pointer in C
我需要制作一个可以注册一些汽车的程序。
然后我需要显示所有登记的汽车。
我无法完成这项工作,当我执行 printf 下方的代码时,只显示内存垃圾,最后一辆车正确显示!
代码(我有一个调用其他函数的菜单函数):
int id = 0;
struct car {
char brand[50];
char model[50];
};
car *garage = 0;
int doCar(){
garage = (struct car *)malloc(sizeof(struct car*));
printf("\n Insert the model: \n\n");
fflush(stdin);
fgets( garage[id].model, 50, stdin);
id++;
}
int ShowCars(){
int i = 0;
while (i < id) {
printf("aqi= %s \n", garage[id].model);
i++;
}
}
考虑以下示例:
#include <stdio.h>
#include <stdlib.h>
struct car {
char brand[50];
char model[50];
};
// dlobal variables
car* garage = NULL;
int cnt = 0;
void doCar(){
// add counter
cnt++;
// add memory
garage = realloc(garage, sizeof(car) * cnt); // NOTE: not malloc
printf("Enter the brand: ");
scanf("%49s", garage[cnt - 1].brand); // or fgets
printf("Enter the model: ");
scanf("%49s", garage[cnt - 1].model); // or fgets
}
void ShowCars(){
int i;
for(i = 0; i < cnt; i++)
{
printf("%s %s\n", garage[i].brand, garage[i].model);
}
}
编辑:
添加main
函数进行测试:
int main(int argc, char* argv[])
{
// test for three cars
doCar();
doCar();
doCar();
ShowCars();
// free memory after using
free(garage);
return 0;
}
在函数 ShowCars
中,第 printf("aqi= %s \n", (*garage + id).model);
行取消引用 garage 并将 id
添加到该结构,这不应该是有意义的。您最好将其替换为您之前使用的 garage[i]
符号,如下所示:
printf("aqi= %s \n", garage[i].model);
此外,正如其他人之前提到的,您需要分配 sizeof(struct car)
的新车(即 50 + 50 = 100)而不是 sizeof(struct car *)
(这很可能在您的32 位指针大小的系统 4)。最后,每次创建新车时,您都必须增加 garage 以指向这些分配。祝你好运!
我需要制作一个可以注册一些汽车的程序。 然后我需要显示所有登记的汽车。
我无法完成这项工作,当我执行 printf 下方的代码时,只显示内存垃圾,最后一辆车正确显示!
代码(我有一个调用其他函数的菜单函数):
int id = 0;
struct car {
char brand[50];
char model[50];
};
car *garage = 0;
int doCar(){
garage = (struct car *)malloc(sizeof(struct car*));
printf("\n Insert the model: \n\n");
fflush(stdin);
fgets( garage[id].model, 50, stdin);
id++;
}
int ShowCars(){
int i = 0;
while (i < id) {
printf("aqi= %s \n", garage[id].model);
i++;
}
}
考虑以下示例:
#include <stdio.h>
#include <stdlib.h>
struct car {
char brand[50];
char model[50];
};
// dlobal variables
car* garage = NULL;
int cnt = 0;
void doCar(){
// add counter
cnt++;
// add memory
garage = realloc(garage, sizeof(car) * cnt); // NOTE: not malloc
printf("Enter the brand: ");
scanf("%49s", garage[cnt - 1].brand); // or fgets
printf("Enter the model: ");
scanf("%49s", garage[cnt - 1].model); // or fgets
}
void ShowCars(){
int i;
for(i = 0; i < cnt; i++)
{
printf("%s %s\n", garage[i].brand, garage[i].model);
}
}
编辑:
添加main
函数进行测试:
int main(int argc, char* argv[])
{
// test for three cars
doCar();
doCar();
doCar();
ShowCars();
// free memory after using
free(garage);
return 0;
}
在函数 ShowCars
中,第 printf("aqi= %s \n", (*garage + id).model);
行取消引用 garage 并将 id
添加到该结构,这不应该是有意义的。您最好将其替换为您之前使用的 garage[i]
符号,如下所示:
printf("aqi= %s \n", garage[i].model);
此外,正如其他人之前提到的,您需要分配 sizeof(struct car)
的新车(即 50 + 50 = 100)而不是 sizeof(struct car *)
(这很可能在您的32 位指针大小的系统 4)。最后,每次创建新车时,您都必须增加 garage 以指向这些分配。祝你好运!