在程序结束时检测到堆栈粉碎

我正在测试一个较小规模的程序,以便在我尝试通过return 0;退出程序时区分问题return 0; 在主要function的最后。

MAIN.C

 #include  #include  #include "Header.h" int main (void) { int i; int Fin = 0; Student sStu; Array aAry; Student *Stu = &sStu; Array *Ary = &aAry; InitArray(Ary, 1); while(Fin != 2) { printf("Please choose a selection.\n"); printf("1. Add Student\n"); printf("2. Print Students\n"); printf("3. Exit\n"); scanf("%d", &i); switch(i) { case 1: { AddStudent(Stu, Ary); break; } case 2: { for(i = 0; i Size; i++) { printf("%s %d\n", Stu[i].Name, Stu[i].IDn); } break; } case 3: { return 0; } } } } 

Header.h

 #ifndef HEADER_H_ #define HEADER_H_ typedef struct student { char Name[30]; int IDn; }Student; typedef struct array { Student *Student; size_t Used; size_t Size; }Array; void InitArray(Array *Ary, int InitSize); void AddArray(Array *Ary); Student AddStudent(Student *Stu, Array *Ary); #endif 

Grade.c

 #include  #include  #include  #include "Header.h" void InitArray(Array *Ary, int InitSize) { Ary->Student = malloc(InitSize * sizeof(Student)); Ary->Used = 0; Ary->Size = InitSize; memset(&Ary->Student[0], 0 , sizeof(Student) * InitSize); } void AddArray(Array *Ary) { Student Stud; if(Ary->Used == Ary->Size) { Ary->Size *= 2; Ary->Student = realloc(Ary->Student, Ary->Size * sizeof(Student)); } strcpy(Ary->Student[Ary->Used].Name, Stud.Name); Ary->Student[Ary->Used].IDn = Stud.IDn; Ary->Used++; } Student AddStudent(Student *Stu, Array *Ary) { int i; printf("\nStudent ID numbers cannot be the same!\n"); printf("Please enter the student's name: "); scanf("%s", Stu[Ary->Used].Name); printf("Please enter the student's ID Number: "); scanf("%d", &Stu[Ary->Used].IDn); AddArray(Ary); printf("\n"); return; } 

在文件的最后,当我尝试return 0; 我收到此错误:

*堆栈粉碎检测到* :./a.out终止分段错误(核心转储)

当我使用valgrind时,我得到这个输出:

 ==9966== Invalid write of size 1 ==9966== at 0x402C6C3: strcpy (in /usr/lib/valgrind/vgpreload_memcheck-x86-linux.so) ==9966== by 0x8048687: AddArray (in /home/ctj0033/CSCE_1040/Homework/2_Homework/2_Test/a.out) ==9966== by 0x804874B: AddStudent (in /home/ctj0033/CSCE_1040/Homework/2_Homework/2_Test/a.out) ==9966== by 0x804881C: main (in /home/ctj0033/CSCE_1040/Homework/2_Homework/2_Test/a.out) ==9966== Address 0x41f804c is 0 bytes after a block of size 36 alloc'd 

在我尝试退出程序期间,valgrind因致命错误而终止。

它只发生在最后,我可以正确打印struct数组的内容。 我已经研究过realloc(); 因为我很确定错误在于其中,但我不确定我做错了什么。 我试图改变我在InitArray();分配内存的方式InitArray(); 以及我使用realloc(); 但无济于事。

我做错了什么?

您当前的问题是您正在尝试使用“无效指针”。 (实际上,它是一个完全有效的指针,它只是指向一个错误的地方)

sStuStudentStu是指向它的指针。 但是当你添加你的第二个学生时,你写信给Stu[1] – 这是sStu之后的空间。 很可能这个空间里还有别的东西,所以当你写Stu[1] ,你会覆盖别的东西。 (这个空间究竟会有什么不可预测的。)

看起来你想要使用Ary->Student到处都有Stu

(如果这样做,您可能会发现更多问题 – 例如,您写入下一个元素检查是否需要扩展数组)