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成功,新大小为6


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

例如:

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


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

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/

10-11 21:08