指向结构时如何正确使用 malloc() 和 realloc()?
How to properly use malloc() and realloc() when pointing to a struct?
这是我的代码:
#include <stdio.h>
#include <stdlib.h>
typedef struct{
char name;
char surname;
int month;
int day;
} person;
person *ptr;
int action, number_of_friends=0, a, b, day, month;
char decision;
int main(void)
{
ptr=(person*)malloc(sizeof(person));
while(1)
{
printf("Please enter the data about the person number %d\n", number_of_friends+1);
person entered_person;
printf("Initial of the name: "); scanf(" %c", &entered_person.name);
printf("Initial of the surname: "); scanf(" %c", &entered_person.surname);
printf("The day of birth: "); scanf("%d", &entered_person.day);
printf("And the month: "); scanf("%d", &entered_person.month);
*(ptr+number_of_friends) = entered_person;
printf("Do you want to add more friends? (y/n) ");
scanf(" %c", &decision);
if (decision=='n' || decision=='N') {
break;
}
number_of_friends++;
ptr=realloc(ptr, number_of_friends);
}
number_of_friends++;
person get_person;
for (a=0; a<number_of_friends; a++)
{
get_person = *(ptr+a);
printf("Person number %d\n", a+1);
printf("Initial of the name: %c\n", get_person.name);
printf("Initial of the surname: %c\n", get_person.surname);
printf("The day of birth: %d\n", get_person.day);
printf("And the month: %d\n\n", get_person.month);
}
}
问题是,如果人数大于...,比如 5,它将无法正确显示输入的人员列表。
我相信这与 malloc() 和 realloc() (写越界?)有关,但作为初学者我不知道如何解决这个问题。
你的 realloc() 大小错误,你想要 number_of_friends 乘以 person 结构的大小(我猜):
ptr=realloc(ptr, number_of_friends*sizeof(person));
编辑:这也会在第一个循环后崩溃:
number_of_friends++;
ptr=realloc(ptr, number_of_friends);
因为 number_of_friends 从 0
开始
number_of_friends++;
ptr=realloc(ptr, number_of_friends);
应该是
person *tmp = realloc( ptr, sizeof *ptr * (number_of_friends + 1) );
if ( tmp )
{
ptr = tmp;
number_of_friends++;
}
请记住,realloc
与 malloc
一样,将存储单元(字节)数作为参数,而不是特定类型的 元素数 .此外,realloc
将 return NULL
失败,因此您希望保留原始指针,直到您确定 realloc
操作成功为止。同样,您不想在 realloc
调用完成之前更新 number_of_friends
。
这是我的代码:
#include <stdio.h>
#include <stdlib.h>
typedef struct{
char name;
char surname;
int month;
int day;
} person;
person *ptr;
int action, number_of_friends=0, a, b, day, month;
char decision;
int main(void)
{
ptr=(person*)malloc(sizeof(person));
while(1)
{
printf("Please enter the data about the person number %d\n", number_of_friends+1);
person entered_person;
printf("Initial of the name: "); scanf(" %c", &entered_person.name);
printf("Initial of the surname: "); scanf(" %c", &entered_person.surname);
printf("The day of birth: "); scanf("%d", &entered_person.day);
printf("And the month: "); scanf("%d", &entered_person.month);
*(ptr+number_of_friends) = entered_person;
printf("Do you want to add more friends? (y/n) ");
scanf(" %c", &decision);
if (decision=='n' || decision=='N') {
break;
}
number_of_friends++;
ptr=realloc(ptr, number_of_friends);
}
number_of_friends++;
person get_person;
for (a=0; a<number_of_friends; a++)
{
get_person = *(ptr+a);
printf("Person number %d\n", a+1);
printf("Initial of the name: %c\n", get_person.name);
printf("Initial of the surname: %c\n", get_person.surname);
printf("The day of birth: %d\n", get_person.day);
printf("And the month: %d\n\n", get_person.month);
}
}
问题是,如果人数大于...,比如 5,它将无法正确显示输入的人员列表。
我相信这与 malloc() 和 realloc() (写越界?)有关,但作为初学者我不知道如何解决这个问题。
你的 realloc() 大小错误,你想要 number_of_friends 乘以 person 结构的大小(我猜):
ptr=realloc(ptr, number_of_friends*sizeof(person));
编辑:这也会在第一个循环后崩溃:
number_of_friends++;
ptr=realloc(ptr, number_of_friends);
因为 number_of_friends 从 0
开始number_of_friends++;
ptr=realloc(ptr, number_of_friends);
应该是
person *tmp = realloc( ptr, sizeof *ptr * (number_of_friends + 1) );
if ( tmp )
{
ptr = tmp;
number_of_friends++;
}
请记住,realloc
与 malloc
一样,将存储单元(字节)数作为参数,而不是特定类型的 元素数 .此外,realloc
将 return NULL
失败,因此您希望保留原始指针,直到您确定 realloc
操作成功为止。同样,您不想在 realloc
调用完成之前更新 number_of_friends
。