c/c++语言开发共享在程序结束时检测到堆栈粉碎

我正在测试一个较小规模的程序,以便在我尝试通过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 Studentn"); printf("2. Print Studentsn"); printf("3. Exitn"); scanf("%d", &i); switch(i) { case 1: { AddStudent(Stu, Ary); break; } case 2: { for(i = 0; i Size; i++) { printf("%s %dn", 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

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

      以上就是c/c++开发分享在程序结束时检测到堆栈粉碎相关内容,想了解更多C/C++开发(异常处理)及C/C++游戏开发关注计算机技术网(www.ctvol.com)!)。

      本文来自网络收集,不代表计算机技术网立场,如涉及侵权请联系管理员删除。

      ctvol管理联系方式QQ:251552304

      本文章地址:https://www.ctvol.com/c-cdevelopment/522352.html

      (0)
      上一篇 2020年12月9日
      下一篇 2020年12月9日

      精彩推荐