c-带整数的归档数组的作用域问题



我正在将一个二进制文件读取到程序中,.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;
    }
}

最新更新