在下面的两个代码中应该发生完全相同的情况:
struct people {
char name[25];
int age;
};
void save() {
FILE *fp;
fp = fopen("things.sve", "wb");
struct people myself;
strcpy(myself.name, "Bruno Macabeus");
myself.age = 18;
struct people fox;
strcpy(fox.name, "Megan Fox");
fox.age = 22;
struct people luffy;
strcpy(luffy.name, "Monkey D. Luffy");
luffy.age = 20;
int totalPeople = 3;
struct people some[2];
some[0] = myself;
some[1] = fox;
some[2] = luffy;
fwrite(&totalPeople, sizeof(int), 1, fp);
//fwrite(some, sizeof(struct people), 3, fp);
fclose(fp);
}
和
struct people {
char name[25];
int age;
};
void save() {
FILE *fp;
fp = fopen("things.sve", "wb");
struct people myself;
strcpy(myself.name, "Bruno Macabeus");
myself.age = 18;
struct people fox;
strcpy(fox.name, "Megan Fox");
fox.age = 22;
struct people luffy;
strcpy(luffy.name, "Monkey D. Luffy");
luffy.age = 20;
struct people some[2];
some[0] = myself;
some[1] = fox;
some[2] = luffy;
int totalPeople = 3;
fwrite(&totalPeople, sizeof(int), 1, fp);
//fwrite(some, sizeof(struct people), 3, fp);
fclose(fp);
}
我只更改了变量"totalPeople"的启动时间,但是,当我保存它时,这会产生很大的变化。在第一种情况下,保存一些奇怪的东西:"66 66 79 00"。在第二种情况下,它有效:"03
00 00 00"。出于什么原因呢?它不应该在两种情况下都有效吗?如何解决这个问题?
您正在越界访问数组some
。它是一个由 2 个元素组成的数组,
struct people some[2];
你把它当作它有 3
.some[2] = luffy;
这会导致未定义的行为。解决方案是不要越界访问数组。