繁体   English   中英

在程序结束时检测到堆栈崩溃

[英]Stack Smashing Detected at End of Program

我目前正在以较小的规模测试程序,以在尝试通过return 0;退出程序时区分问题return 0; 在主要功能的末尾。

Main.c

#include <stdio.h>
#include <stdlib.h>
#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 < Ary->Size; i++)
                                {
                                        printf("%s %d\n", Stu[i].Name, Stu[i].IDn);
                                }
                                break;
                        }
                        case 3:
                        {
                                return 0;
                        }
                }
        }
}

标头

#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

C级

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#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(); 但无济于事。

我做错了什么?

您的直接问题是您正在尝试使用“无效的指针”。 (实际上,这是一个完全有效的指针,只是指向错误的位置)

sStuStudent ,而Stu是指向它的指针。 但是,当您添加第二个学生时,您将写入Stu[1] sStu后面的sStu 此空间中很可能还有其他内容,因此当您写入Stu[1] ,您将覆盖其他内容。 (在那个空间中到底是什么,这是无法预测的。)

看来您想在所有拥有Stu地方都使用Ary->Student

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM