此代码接受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/