Smacking de stack détecté à la fin du programme

Je teste actuellement un programme à une plus petite échelle afin de distinguer un problème lorsque je tente de quitter le programme en return 0; à la fin de la fonction principale.

Principal 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; } 

À la fin du fichier, lorsque j’essaie de return 0; Je reçois cette erreur:

* éclatement de stack détecté * : erreur de segmentation (./a.out terminée) (kernel vidé)

Lorsque j’utilise valgrind, j’obtiens cette sortie:

 ==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 se termine en raison d’une erreur fatale lors de ma tentative de sortie de mon programme.

Cela ne se produit qu’à la fin et je peux imprimer correctement le contenu du tableau struct. J’ai examiné realloc(); étant donné que je suis à peu près sûr que l’erreur est à l’intérieur de cela, cependant je ne sais pas exactement ce que j’ai fait de mal J’ai essayé de modifier la façon dont InitArray(); la mémoire dans InitArray(); et la façon dont j’utilise realloc(); mais en vain.

Qu’est ce que j’ai mal fait?

Votre problème immédiat est que vous essayez d’utiliser un “pointeur invalide”. (En fait, c’est un pointeur complètement valide, il pointe juste au mauvais endroit)

sStu est un Student , et Stu est un pointeur. Mais lorsque vous ajoutez votre deuxième élève, vous écrivez dans Stu[1] – qui est l’espace après sStu . Très probablement il y a quelque chose d’autre dans cet espace, donc quand vous écrivez dans Stu[1] , vous écrasez quelque chose d’autre. (C’est imprévisible exactement ce qu’il y aura dans cet espace.)

On dirait que vous voulez utiliser Ary->Student partout où vous avez Stu .

(Si vous faites cela, vous rencontrerez peut-être d’autres problèmes, tels que le fait de vérifier si vous devez développer le tableau après avoir écrit sur l’élément suivant.)