我想存储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);
}
}
}
}
}
但我发现它无法分配内存......
答案 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()(已经简单得多了)。