C: 指针混淆

标签 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");
}

这应该在二进制文件中输出学生人数和所有结构“数组”,并且它适用于 1 名学生。但是当我添加 >=2 人时,文件如下所示: http://i.imgur.com/LgL8fUa.png

如果我只添加 1 个学生,仍然有一些 Windows 路径废话: http://i.imgur.com/s7fm9Uv.png 不过没关系,读取文件的程序会忽略 NULL 之后的所有内容(我的意思是,对于第一个字符数组)。

我认为问题出在 for() 循环中的某处和指针变戏法,但我不知道是哪里。

最佳答案

student* ptr = students + i * sizeof(student);

在 C 中,指针算法已经包含了 sizeof(student)。您将阅读数组末尾的内容。

student* ptr = students + i;

但是,您会注意到访问 ptr 与访问 students[i] 是一样的。

关于C: 指针混淆,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15663029/

相关文章:

c++ - 如何在 BlackBerry 10 Simulator 上模拟捏合?

Char 和 int16 数组元素都显示为 32 位十六进制?

c - select() 不等待

C++ - 数组是指针吗?

c# - 将字符串分配给指向字符的指针

c++ - FlatBuffers:写入和读取二进制文件?

Java-如何在文件中写入位而不是字符

c++ - C++ 是建立在 C 之上的吗?

c++ - 如何给struct成员中的双指针赋值?

c - 如何在 C 中从二进制文件(使用 ab+)读取后打印结构成员