C:指针混淆

Nac*_*ack 2 c pointers binaryfiles

#include<stdio.h>
#include<stdlib.h>


typedef struct{
        char cStdName[50];
        int  nStdNum;
        char cStdClass[4];
        float dStdAvg;
}student;

student* students;

int cmp(const void* a, const void* b);

void main() {
    int num = 0,i=0;
    FILE *f;

    printf("Number of students:");
    scanf("%d", &num);
    students = (student*)malloc(num*sizeof(student));

    for(i=0;i<num;++i){

        student* ptr = students+i*sizeof(student);
        printf("Name:");
        scanf("%s", ptr->cStdName);
        printf("Num");
        scanf("%d", &ptr->nStdNum);
        printf("Class:");
        scanf("%s", ptr->cStdClass);
        printf("Grade:");
        scanf("%f", &ptr->dStdAvg);
    }

    f = fopen("bin.bin","wb");
    fwrite(&num,sizeof(int),1,f);
    fwrite(students,sizeof(student),num,f);
    fclose(f);
    system("pause");
}
Run Code Online (Sandbox Code Playgroud)

这应该输出学生的数量和二进制文件中的所有结构'数组',它适用于1名学生.但是当我添加> = 2个人时,文件看起来像这样:http: //i.imgur.com/LgL8fUa.png

如果我只添加一个学生,仍然有一些这样的Windows路径无稽之谈:http: //i.imgur.com/s7fm9Uv.png 虽然可以,读取文件的程序会忽略NULL后的所有内容(我的意思是,对于第一个char数组).

我认为问题是在for()循环和指针杂耍的某处,但我不知道在哪里.

md5*_*md5 5

student* ptr = students + i * sizeof(student);
Run Code Online (Sandbox Code Playgroud)

在C中,指针算法已包含sizeof(student).你将阅读你的arrray结束.

student* ptr = students + i;
Run Code Online (Sandbox Code Playgroud)

但是,您会注意到访问权限ptr与访问权限相同students[i].