gpt4 book ai didi

c - 结构体的重新分配

转载 作者:行者123 更新时间:2023-11-30 15:36:42 24 4
gpt4 key购买 nike

typedef struct dvdtype{
int dvdcode;
char title[50];
int customerID;
int daysowned;
}dvdtype;

typedef struct dvdstruct{
dvdtype *dvd;
int numdvds;
}dvdstruct;

void initDvds(dvdstruct *dvds);
int displayMainMenu();
void insertMovie(dvdstruct *dvds,int *n);

void initDvds(dvdstruct *dvds)
{
int i;

dvds->dvd=(dvdtype*)malloc(5*sizeof(dvdtype));
if(dvds->dvd==NULL){

printf("not enough memory\n");
exit(1);
}

dvds->numdvds=0;
for(i=0;i<5;i++)
{
dvds->dvd[i].customerID=-1;
dvds->dvd[i].daysowned=-1;
dvds->dvd[i].dvdcode=-1;
dvds->dvd[i].title[0]='\0';
}
}

void insertMovie(dvdstruct *dvds,int *n){
int code;

if(dvds->numdvds>=(*n))
{
dvds->numdvds++;
dvds->dvd=realloc(dvds->dvd,(dvds->numdvds)*sizeof(dvdtype));
if(dvds->dvd==NULL){

printf("not enough memory\n");
exit(1);
}

printf(" realloc succesful,size now is :%d \n",dvds->numdvds);
dvds->dvd[dvds->numdvds].customerID=-1;
dvds->dvd[dvds->numdvds].daysowned=-1;
printf("give code and name of movie \n");
scanf("%d\n",&code);
dvds->dvd[dvds->numdvds].dvdcode=code;
gets(dvds->dvd[dvds->numdvds].title);
}
else
{
printf("give code and name of movie \n");
scanf("%d\n",&code);
dvds->dvd[dvds->numdvds].dvdcode=code;
gets(dvds->dvd[dvds->numdvds].title);
dvds->numdvds++;
}
}

我编写这个程序是为了制作一个电影列表。通过函数inidvds,我使用malloc为5张DVD“腾出空间”并进行初始化。然后,用户调用函数insertmovie将电影插入到文件中。

老师希望我们做到以下几点。如果用户提供 5 张 DVD(这就是我们从一开始就想要的大小),则调用函数 realloc 并为另外 1 张 DVD 腾出空间。这很有效,我的意思是当我提供 5 部电影时就可以了。我可以选择打印电影,它可以打印全部 5 部电影。然后,如果我选择再次添加电影 (n=5),它将转到 if 并且必须执行 realloc 函数。

我把这个

printf(" malloc successful,size now is :%d \n",dvds->numdvds);

这样我就可以看看它是否确实进入了realloc。它打印:

malloc is successful and the new size is 6

它要求我提供我们想要的电影代码和名称。我给出代码和名称,然后再次打印列表。它可以打印我给出的前 5 部电影,但不会打印第 6 部电影。

例如:

Dvdcode is 5
dvd name is: tarzan
Customer id is: -1(the initialized value)

假设这是我拍摄的第五部电影。那么第6个就是这样。

Dvdcode is 0
dvd name is:
Customer id is: 0
(Dvd name is empty)

这是什么意思? realloc 不起作用?

最佳答案

C 中的数组是基于 0 的,即第一个元素是 array[0],第二个元素是 array[1] 并且等等。

所以 insertMovie() 的那些行:

  if(dvds->numdvds>=(*n))
{
dvds->numdvds++;
dvds->dvd=realloc(dvds->dvd,(dvds->numdvds)*sizeof(dvdtype));
if(dvds->dvd==NULL){

printf("not enough memory\n");
exit(1);
}

printf(" realloc succesful,size now is :%d \n",dvds->numdvds);
dvds->dvd[dvds->numdvds].customerID=-1;
dvds->dvd[dvds->numdvds].daysowned=-1;
printf("give code and name of movie \n");
scanf("%d\n",&code);
dvds->dvd[dvds->numdvds].dvdcode=code;
gets(dvds->dvd[dvds->numdvds].title);

应为:

  if(dvds->numdvds>=(*n))
{
dvds->dvd=realloc(dvds->dvd,(dvds->numdvds + 1)*sizeof(dvdtype));
if(dvds->dvd==NULL){

printf("not enough memory\n");
exit(1);
}

printf(" realloc succesful,size now is :%d \n",dvds->numdvds + 1);
dvds->dvd[dvds->numdvds].customerID=-1;
dvds->dvd[dvds->numdvds].daysowned=-1;
printf("give code and name of movie \n");
scanf("%d\n",&code);
dvds->dvd[dvds->numdvds].dvdcode=code;
gets(dvds->dvd[dvds->numdvds].title);

dvds->numdvds++;

关于c - 结构体的重新分配,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22477402/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com