二维动态结构数组无法按预期工作
2D dynamic array of structures does not work as intended
所以,我有一个二维结构数组。我逐个元素地输入结构,但程序打印了一些随机数据,而不是输入的信息。例如,ptr[0][0].Flat_ID
应该是 101,但它打印出 8
,至于其他元素,它完全是胡言乱语。任何想法为什么这样做?
结构:
typedef struct
{
int Flat_ID;
int count_Rooms;
int count_Adults;
int count_Children;
char Family_Surname[20];
char Date[15];
float rent;
}S_Apartament;
而里面的程序main()
:
int floors=1, flats_per_floor=2;
S_Apartament Flats;
S_Apartament **ptr = (S_Apartament **)malloc(sizeof(S_Apartament*) * floors);//Declaring an array of pointers. It has to be dynamic, as per the assignment
if(ptr == NULL)
{
printf("Memory fail");
free(ptr);
exit(8);
}
for (int i = 0; i < floors; i++)
{
ptr[i] = (S_Apartament *)malloc(sizeof(S_Apartament)*flats_per_floor);//Each pointer from the first array now is an array of its own, with elements being structures
if(ptr[i] == NULL)
{
printf("Memory fail");
free(ptr);
exit(8);
}
}
for(int i = 0; i < floors; i++)
{
for(int j = 0; j < flats_per_floor; j++)
{
printf("ID:\n");
scanf("%d", &ptr[i][j].Flat_ID);
printf("\n");
printf("Rooms:\n");
scanf("%d", &ptr[i][j].count_Rooms);
printf("\n");
printf("Adults:\n");
scanf("%d", &ptr[i][j].count_Adults);
printf("\n");
printf("Children:\n");
scanf("%d", &ptr[i][j].count_Children);
printf("\n");
printf("Name:\n");
scanf("%s", ptr[i][j].Family_Surname);
printf("\n");
printf("Date of entry: \n");
scanf("%s", ptr[i][j].Date);
printf("\n");
printf("Rent:\n");
scanf("%f", &ptr[i][j].rent);
printf("\n");
ptr[i][j]=Flats;
}
}
for(int i=0; i< floors; i++)//Prints read information
{
for(int j=0; j< flats_per_floor; j++)
{
printf("ID: %d\n", ptr[i][j].Flat_ID);
printf("Rooms: %d\n", ptr[i][j].count_Rooms);
printf("Adults: %d\n", ptr[i][j].count_Adults);
printf("Children: %d\n", ptr[i][j].count_Children);
printf("Name: %s\n", ptr[i][j].Family_Surname);
printf("Date of entry: %s\n", ptr[i][j].Date);
printf("Rent: %0.2f\n", ptr[i][j].rent);
}
printf("-----------------");
printf("\n");
}
free(ptr);
这是一个示例输出:
Output
您没有检查 scanf
的结果。只是不成功,没有给成员赋值
命令ptr[i][j]=Flats;
将在每次迭代开始时被删除,因为程序没有将信息保存在正确的位置。
循环应如下所示:
for(int i = 0; i < floors; i++)
{
for(int j = 0; j < flats_per_floor; j++)
{
printf("ID:\n");
scanf("%d", &ptr[i][j].Flat_ID);
printf("\n");
printf("Rooms:\n");
scanf("%d", &ptr[i][j].count_Rooms);
printf("\n");
printf("Adults:\n");
scanf("%d", &ptr[i][j].count_Adults);
printf("\n");
printf("Children:\n");
scanf("%d", &ptr[i][j].count_Children);
printf("\n");
printf("Name:\n");
scanf("%s", ptr[i][j].Family_Surname);
printf("\n");
printf("Date of entry: \n");
scanf("%s", ptr[i][j].Date);
printf("\n");
printf("Rent:\n");
scanf("%f", &ptr[i][j].rent);
printf("\n");
}
}
所以,我有一个二维结构数组。我逐个元素地输入结构,但程序打印了一些随机数据,而不是输入的信息。例如,ptr[0][0].Flat_ID
应该是 101,但它打印出 8
,至于其他元素,它完全是胡言乱语。任何想法为什么这样做?
结构:
typedef struct
{
int Flat_ID;
int count_Rooms;
int count_Adults;
int count_Children;
char Family_Surname[20];
char Date[15];
float rent;
}S_Apartament;
而里面的程序main()
:
int floors=1, flats_per_floor=2;
S_Apartament Flats;
S_Apartament **ptr = (S_Apartament **)malloc(sizeof(S_Apartament*) * floors);//Declaring an array of pointers. It has to be dynamic, as per the assignment
if(ptr == NULL)
{
printf("Memory fail");
free(ptr);
exit(8);
}
for (int i = 0; i < floors; i++)
{
ptr[i] = (S_Apartament *)malloc(sizeof(S_Apartament)*flats_per_floor);//Each pointer from the first array now is an array of its own, with elements being structures
if(ptr[i] == NULL)
{
printf("Memory fail");
free(ptr);
exit(8);
}
}
for(int i = 0; i < floors; i++)
{
for(int j = 0; j < flats_per_floor; j++)
{
printf("ID:\n");
scanf("%d", &ptr[i][j].Flat_ID);
printf("\n");
printf("Rooms:\n");
scanf("%d", &ptr[i][j].count_Rooms);
printf("\n");
printf("Adults:\n");
scanf("%d", &ptr[i][j].count_Adults);
printf("\n");
printf("Children:\n");
scanf("%d", &ptr[i][j].count_Children);
printf("\n");
printf("Name:\n");
scanf("%s", ptr[i][j].Family_Surname);
printf("\n");
printf("Date of entry: \n");
scanf("%s", ptr[i][j].Date);
printf("\n");
printf("Rent:\n");
scanf("%f", &ptr[i][j].rent);
printf("\n");
ptr[i][j]=Flats;
}
}
for(int i=0; i< floors; i++)//Prints read information
{
for(int j=0; j< flats_per_floor; j++)
{
printf("ID: %d\n", ptr[i][j].Flat_ID);
printf("Rooms: %d\n", ptr[i][j].count_Rooms);
printf("Adults: %d\n", ptr[i][j].count_Adults);
printf("Children: %d\n", ptr[i][j].count_Children);
printf("Name: %s\n", ptr[i][j].Family_Surname);
printf("Date of entry: %s\n", ptr[i][j].Date);
printf("Rent: %0.2f\n", ptr[i][j].rent);
}
printf("-----------------");
printf("\n");
}
free(ptr);
这是一个示例输出: Output
您没有检查 scanf
的结果。只是不成功,没有给成员赋值
命令ptr[i][j]=Flats;
将在每次迭代开始时被删除,因为程序没有将信息保存在正确的位置。
循环应如下所示:
for(int i = 0; i < floors; i++)
{
for(int j = 0; j < flats_per_floor; j++)
{
printf("ID:\n");
scanf("%d", &ptr[i][j].Flat_ID);
printf("\n");
printf("Rooms:\n");
scanf("%d", &ptr[i][j].count_Rooms);
printf("\n");
printf("Adults:\n");
scanf("%d", &ptr[i][j].count_Adults);
printf("\n");
printf("Children:\n");
scanf("%d", &ptr[i][j].count_Children);
printf("\n");
printf("Name:\n");
scanf("%s", ptr[i][j].Family_Surname);
printf("\n");
printf("Date of entry: \n");
scanf("%s", ptr[i][j].Date);
printf("\n");
printf("Rent:\n");
scanf("%f", &ptr[i][j].rent);
printf("\n");
}
}