访问违规写入位置0xCDCDCDCD

时间:2015-06-01 17:19:32

标签: c++ stack

我正在尝试使用一个结构“学生”和另一个结构“堆栈”创建一个小链表,该结构包含学生结构和指向下一个元素的指针。

然而,我不断收到内存访问错误。我仔细检查以确保所有指针都已初始化(只有一个指针,Stacktop,初始化为NULL)

以下是结构定义:

#include <stdio.h>
#include <string>
#include <iostream>
#include <stdlib.h>

using namespace std;

struct students
{
   int matnr;
   string name;
};

struct stack
{
   students stud;
   stack *next;
};

typedef struct stack Stack;
typedef Stack *ptrStack;

void push(students s);
students pop();
int isEmpty();
void printStack(students stud);

这是push函数(不断崩溃程序)

#include "stack.h"

ptrStack Stacktop = NULL;

void push(students s)
{
    ptrStack stack = (ptrStack)malloc(sizeof(Stack));

    if (stack == NULL)
    {
        cout << "!!FIN!!" << endl;
        return;
    }

    stack->stud = s;
    stack->next = Stacktop;
    Stacktop = stack;

    return; 
}

这是主要的:

#include "stack.h"

students readStuds()
{
    students s;

    cout << "Enter Student name: " << endl;
    cin >> s.name;
    cout << "Enter Matr Nr: " << endl;
    cin >> s.matnr;

    return s;
}

int main()
{

char c;

do {
        push(readStuds());

        cout << "Continue Entering Students? " << endl;
        cin >> c;
        cout << "----------------------" << endl;
        cout << "----------------------" << endl;
} while (c != 'q');

cout << " POPPING STACK " << endl;
cout << " ............. " << endl;

while (isEmpty())
{
    printStack(pop());
}

}

3 个答案:

答案 0 :(得分:5)

此:

ptrStack stack = (ptrStack)malloc(sizeof(Stack));

分配足够的内存来保存struct stack a.k.a Stack,但malloc()没有做任何事情来初始化返回的内存。因此,特别是,新string中的stack包含随机垃圾,然后由cin >> s.name解释,并假定为有效string,不是,所以代码失败了。

解决方案 - 改为使用ptrStack stack = new Stack。更好的是,编写适当的构造函数/析构函数,复制构造函数,赋值运算符等......

答案 1 :(得分:3)

问题是你正在混合C和C ++,特别是在这行代码中

Stack

string结构包含string类型的对象。必须先调用string构造函数才能使用new。如果使用C ++ string运算符分配内存,则会自动调用构造函数,并正确初始化malloc

但是如果你使用C string函数分配内存,那么0xCDCDCDCD构造函数就是 而不是 var approve = url + '?approval=true'+'?reply='+requestorEmail; var reject = url + '?approval=false'+'?reply='+requestorEmail; 来自字符串对象中的一个未初始化的指针,该指针应该由构造函数初始化(但是因为没有调用构造函数,因此没有)。

故事的寓意:不要混合使用C和C ++,直到你有很多经验。

答案 2 :(得分:1)

您正在做:

ptrStack stack = (ptrStack)malloc(sizeof(Stack));
                                         ^^^^^

定义为:

typedef Stack *ptrStack;

因此,sizeof(Stack)基本上是size(pointer)。你没有为你的结构分配足够的内存,你需要为你的结构分配足够的内存用于POINTER。所以,是的,你正在运行已分配内存的末尾