c

时间:2016-01-06 18:24:58

标签: c gcc

我相信声明结构 学生 的数组 记录 ,具有另一个结构的数组( 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;
}

1 个答案:

答案 0 :(得分:2)

record[2]访问record的第三个元素,它只有两个元素,因为它被声明为struct student record[2];。将此更改为struct student record[3];,以便您拥有所需的空间,或将代码更改为只有两名学生。