此代码接受struct Student数组,然后使用指针显示它。
该代码使用的不是那么常见的方法。通用方法在此代码本身的单行注释中显示。

但是,这种方法似乎存在一些问题,因为未显示正确的“百分比”值。谁能告诉我这个问题的原因是什么?

#include<stdio.h>

struct Student
{
    char grade;
    int rollNumber;
    float percentage;
};

typedef struct Student Student;

void acceptArray(Student*);
void displayArray(Student*);

int main()
{
    Student myFriends[3];
    Student* p = myFriends;

    acceptArray(p);
    displayArray(p);
}

void acceptArray(Student* p)
{
    int i = 0;
    for(i = 0; i < 3; i++)
    {
        printf("\nEnter grade, roll number, and percentage:\n");
        scanf(" %c %d %f",
                (p + i),
                //&(p + i)->grade
                //&p[i].grade
                ( (Student*)((unsigned int)p + sizeof(char)) + i ),
                //&(p + i)->rollNumber
                //&p[i].rollNumber
                ( (Student*)((unsigned int)p + sizeof(char) + sizeof(int)) + i )
                //&(p + i)->percentage
                //&p[i].percentage
                );
     }
}

void displayArray(Student* p)
{
    int i = 0;
    for(i = 0; i < 3; i++)
    {
        printf("\nGrade is      :   %c.", *(p + i));
                //(p + i)->grade
                //p[i].grade
        printf("\nRoll number is:   %d.", *( (Student*)((unsigned int)p + sizeof(char)) + i ));
                //(p + i)->rollNumber
                //p[i].rollNumber
        printf("\nPercentage is : %.1f.", *( (Student*)((unsigned int)p + sizeof(char) + sizeof(int)) + i ));
                //(p + i)->percentage
                //p[i].percentage
     }
}

最佳答案

您试图将struct对象的各个组件地址传递给scanf。您做的方式是错误的。这是不对的,因为(摘自C A参考手册Book)。


  在任何两个连续的组件之间可能会出现孔或填充物,或者
  在结构布局中的最后一个组件之后
  允许内存中组件的正确对齐。位模式
  出现在此类孔中是无法预测的,并且可能与
  在单个结构中进行结构化或随着时间的流逝。


话虽这么说,它总是比我们通常做的更干净,易读且结构更容易阅读(&p[i].grade ..)。让简单的事情保持简单。

关于c - “使用指针访问结构数组”的替代方法,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/47858628/

10-09 06:04
查看更多