[[结构数组中的结构数组]中[结构数组]中的结构动态数组]

时间:2015-01-27 18:22:39

标签: c arrays pointers struct malloc

我想存储100名员工。 RollNo,姓名,薪水和时间(各种数据,我在这里无法解释,但您可以理解下面的代码片段

main() 
{
    struct day {
      int hour[40];
      int min[40];
      int mins[40];
      int rec;
      int totmins;
      int totsal;
      char status;
      int temp;
    };
    struct month {
      struct day * da[31];
    };

    struct year {
      struct month * mn[12];
    };

    struct roll {
      int rn;
      char name[30];
      int salary;
      struct year * yr[25];
    };

所以我通过

动态分配了内存
struct day *da[31];
    for(i=0;i<=31;i++)
        {   da[i]=(struct day*)malloc(31 * sizeof *da);
             if( da[i]== NULL )
             {printf("%d Couldn't able to allocate requested memory for day\n",i);getch();exit(0);}
        }

struct month *mn[12];
    for(i=0;i<=12;i++)
        {   mn[i]=(struct month*)malloc( 12 * sizeof *mn);
            if( mn[i]== NULL )
             {printf("%d Couldn't able to allocate requested memory for month\n",i);getch();exit(0);}
        }

struct year *yr[25];
    for(i=0;i<=25;i++)
        {   yr[i]=(struct year*)malloc( 25 * sizeof *yr);
            if( yr[i]== NULL )
                {printf("%d Couldn't able to allocate requested memory for year\n",i);getch();exit(0);}
        }

struct roll *rol[100];
    for(i=0;i<=100;i++)
        {   rol[i]=(struct roll*)malloc(100 * sizeof *rol));
             if( rol[i]== NULL )
             {printf("%d Couldn't able to allocate requested memory for roll\n",i);getch();exit(0);}
        }

但是在我的实际代码中,当我这样做时 [考虑d = 27,m = 1,y = 15且i = 1]

rol[i] - > yr[y] - > mn[m] - > da[d] - > rec++;

它也在增加其余成员,即

rol[2] - > yr[y] - > mn[m] - > da[d] - > rec++;
.
.

rol[100] - > yr[y] - > mn[m] - > da[d] - > rec++;

这意味着分配中只有一些错误......任何人都可以帮助我吗?


修改后的代码:

    for (i = 0; i < 100; i++) {
      rol[i] = (struct roll * ) malloc(100 * sizeof(struct roll));
      if (rol[i] == NULL) {
        printf("%d Couldn't able to allocate requested memory for roll\n", i);
        getch();
        exit(0);
      }
      for (j = 0; j < 25; j++) {
        rol[i] -> yr[j] = (struct year * ) malloc(25 * sizeof(struct year));
        if (rol[i] -> yr[j] == NULL) {
          printf("%d Couldn't able to allocate requested memory for year\n", i);
          getch();
          exit(0);
        }

        for (k = 0; k < 12; k++) {
          rol[i] -> yr[j] -> mn[k] = (struct month * ) malloc(12 * sizeof(struct month));
          if (rol[i] -> yr[j] -> mn[k] == NULL) {
            printf("%d Couldn't able to allocate requested memory for month\n", i);
            getch();
            exit(0);
          }

          for (l = 0; l < 31; l++) {
            rol[i] -> yr[j] -> mn[k] -> da[l] = (struct day * ) malloc(31 * sizeof(struct day));
            if (rol[i] -> yr[j] -> mn[k] -> da[l] == NULL) {
              printf("%d Couldn't able to allocate requested memory for day\n", l);
              getch();
              exit(0);
            }
          }
        }
      }
    }

但我发现它无法分配内存......

2 个答案:

答案 0 :(得分:0)

struct day *da[31];
    for(i=0;i<=31;i++)
        {   da[i]=(struct day*)malloc(31 * sizeof *da);
             if( da[i]== NULL )
             {printf("%d Couldn't able to allocate requested memory for day\n",i);getch();exit(0);}
        }

这段代码错了。

您正在创建一个包含31个元素的结构数组。 0-30。

你在循环中经历了32个元素或0-31。

将&lt; = 31更改为&lt; 31

答案 1 :(得分:0)

我没有看到你初始化任何指针的任何地方。也许指针初始化是在你没有透露的代码中。

malloc()返回未初始化的内存。编译器的调试选项可能初始化从malloc()返回的内存。初始化将是一些非零的值或可能有助于调试的值。例如,malloc()的调试版本可能会分配请求的数量加上5个字节。官方分配的数量可能初始化为0xa5a,额外的5个字节可能初始化为0x5a5。这样,通常可以检测到缓冲区的小溢出(超过5个字节的溢出)。

我认为你的代码显示调用malloc()32 + 13 + 26 + 101 = 172次。但我怀疑你想调用malloc()31 * 12 * 25 * 100 = 230,000次。这是很多分配和大量的内存。但看起来这就是你的意图。您需要31天,因此每月需要31次分配。你想要每年12个月,每个年25年,以及100个月。所以,这看起来更像是乘法,而不是添加malloc()调用。

我猜你没有初始化你的指针并且正在使用malloc()的调试版本。你未初始化的指针是101 * 26 = 2626年的指针。这是你的每一个101 rns 25指针。然后对于每年的指针,你有13个月未指定的指针等等。

我认为代码中发生的事情是处理器正在使用malloc内存的调试初始化作为引用地址。如果内存初始化为零字节,处理器将检测到NULL指针,您将收到运行时错误。但是,处理器认为您通过有效地址引用,因此不会抱怨。出现的是你正在增加一些与你的结构无关的野性地址。因为所有结构都使用相同的通配地址,所以看起来好像所有rec都在递增。

你需要做的是为rn分配。然后为每个rn分配25年中的每一年。确保每年的分数为该年度的分配。那是初始化。然后为每个rn和每年分配一个月,并初始化,以便每个月指向一个分配......等。

听起来很多工作,很复杂。因此,如果您有选择,您可能想要想出其他解决方案。

要想出另一种解决方案,您可以考虑如何在Excel中布置字段(列)。这会让你成为一个结构。你可能只调用一次malloc()(已经简单得多了)。