我正在测试一个较小规模的程序,以便在我尝试通过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();
但无济于事。
我做错了什么?
您当前的问题是您正在尝试使用“无效指针”。 (实际上,它是一个完全有效的指针,它只是指向一个错误的地方)
sStu
是Student
, Stu
是指向它的指针。 但是当你添加你的第二个学生时,你写信给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