我相信声明结构 学生 的数组 记录 ,具有另一个结构的数组( StudentData )作为成员,会为所有成员自动分配静态内存。但是这个程序崩溃[分段错误(核心转储)在行记录[2] .percentage = 81.5;]
换句话说,我相信对于 record [0] ,我会分配静态sizeof(int),sizeof(float)和每个220字节的30个数组(20个用于名称,200 <地址)。甚至调试器都证实了这个假设,但程序崩溃了。
我想知道我做错了什么,或者我是否错过了解c或其他内容的结构数组的静态分配。
我正在使用gcc。
谢谢!
#include <stdio.h>;
#include <string.h>;
typedef struct StData{
char name[20];
char address[200];
} StData;
struct student{
int id;
struct StData StudentData[30];
float percentage;
};
void tgin_ini(struct StData tgin[],int tgin_size){
int n;
for(n=0;n<tgin_size;++n){
tgin[n].name[0] = '\0';
tgin[n].address[0] = '\0';
}
}
int main(){
int i,n;
struct student record[2];
for(n=0;n<2;++n){
record[n].id=1;
record[n].percentage = 86.5;
tgin_ini(record[n].StudentData,30);
}
// 1st student's record
record[0].id=1;
strcpy(record[0].StudentData[0].name, "Raju");
strcpy(record[0].StudentData[0].address, "Planet earth, island called america");
record[0].percentage = 86.5;
// 2nd student's record
record[1].id=2;
strcpy(record[1].StudentData[1].name, "Surendren");
strcpy(record[1].StudentData[1].address, "Planet earth, island called europa");
record[1].percentage = 90.5;
// 3rd student's record
record[2].id=3;
strcpy(record[2].StudentData[2].name, "Thiyagu");
strcpy(record[2].StudentData[2].address, "Planet earth, island called asia");
record[2].percentage = 81.5;
for(i=0; i<3; i++)
{
printf(" Records of STUDENT : %d \n", i+1);
printf(" Id is: %d \n", record[i].id);
printf(" Name is: %s \n", record[i].StudentData[i].name);
printf(" Name is: %s \n", record[i].StudentData[i].address);
printf(" Percentage is: %f\n\n",record[i].percentage);
}
return 0;
}
答案 0 :(得分:2)
record[2]
访问record
的第三个元素,它只有两个元素,因为它被声明为struct student record[2];
。将此更改为struct student record[3];
,以便您拥有所需的空间,或将代码更改为只有两名学生。