我正在将一个二进制文件读取到程序中,.dat文件中的第一个"东西"是一个整数,它告诉我的文件中有多少个孔。基本上,我打印一个动物列表,如果用户决定从列表中删除一只动物,我会将其年龄更改为-1,并将其添加到我的"洞"中。主要的问题是,我认为我的程序存在范围问题,但我在C.方面仍然相当业余
int * countHoles(FILE *file, struct animal ani, int holesValue) {
int i = 0;
int * availableHoles = malloc(sizeof(int) * 100);
for (i = 0; i < 100; i++) {
availableHoles[i] = 0;
}
while (1) {
fread(&ani, sizeof(ani), 1, file);
if (feof(file)) {
break;
}
if (ani.age < 0) {
availabeHoles[i] = ani.id;
printf("You found one! &dn", availableHoles[i]);
}
}
for (i = 0; i < holesValues; i++) {
printf("availableHoles: %dt", availableHoles);
}
return availableHoles;
}
所以我传递的东西是我在main()函数中打开的.dat文件,我拥有的动物结构,包括ID、名称、物种、年龄、体重(这部分并不重要),以及我从文件中读取的第一个整数中的洞。原始文件以3个洞开始,但随着用户删除动物,洞值显然会更新。在"if(ani.age<0)"语句中,我的printf()打印年龄为-1的正确ID,但当我尝试将数组传递回main()时,我只能打印0。起初,我认为问题是我将数组返回到main()函数,并在那里打印它,看看它是否正确通过。过了一段时间,我决定在遍历文件后立即打印孔的ID,我注意到在"for(I=0;I<holesValue;I++)"期间,该部分也只打印0。我很困惑,因为我不明白在我的if(ani.age<0)语句中,如何没有"真正"将这些值冲压到我的可用Holes[]数组中。我只是不明白如何解决这个问题。提前感谢!!
问题是,在中间循环(while (1) { ...
)中,您使用i
,但从未将其设置为任何值。它以值100—上一个循环结束时的内容—并且对CCD_ 3的所有写入实际上是对availableHoles[100]
的写入(其实际上是堆上所分配阵列之外的一个位置)。
我不太清楚你想如何填充availableHoles
,但你应该在进入中间循环之前将i
初始化为0
,并在循环中增加i
一次,或者每次存储新的动物id时增加一次
i = 0;
while (1) {
...
if (ani.age < 0) {
availabeHoles[i++] = ani.id;
printf("You found one! &dn", availableHoles[i]);
}
}
或
i = 0;
while (1) {
...
if (ani.age < 0) {
availabeHoles[i] = ani.id;
printf("You found one! &dn", availableHoles[i]);
++i;
}
}