访问冲突写入位置 0xCDCDCDCD
Access Violation writing location 0xCDCDCDCD
我正在尝试使用一个结构 "students" 和另一个结构 "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);
这里是推送函数(一直让程序崩溃)
#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());
}
}
你在做:
ptrStack stack = (ptrStack)malloc(sizeof(Stack));
^^^^^
定义为:
typedef Stack *ptrStack;
因此,sizeof(Stack)
本质上是 size(pointer)
。您没有为结构分配足够的内存,而是为结构的指针分配了足够的内存。所以是的,您 运行 已分配内存
这个:
ptrStack stack = (ptrStack)malloc(sizeof(Stack));
分配了足够的内存来容纳 struct stack
a.k.a Stack
,但是 malloc()
没有做任何事情来初始化返回的内存。因此,特别是,您的新 stack
中的 string
包含随机垃圾,然后将由您的 cin >> s.name
解释并假定为有效的 string
,它不是,所以代码失败。
解决方案 - 使用 ptrStack stack = new Stack
代替。更好的是,编写适当的 constructors/destructors、复制构造函数、赋值运算符等...
问题是您混合使用了 C 和 C++,特别是在这行代码中
ptrStack stack = (ptrStack)malloc(sizeof(Stack));
Stack
结构包含一个 string
类型的对象。 string
构造函数 必须先调用 才能使用 string
。如果使用 C++ new
运算符分配内存,则会自动调用构造函数,并正确初始化 string
。
但是如果你使用Cmalloc
函数分配内存,那么string
构造函数是不是叫。 0xCDCDCDCD
来自字符串对象中未初始化的指针,该指针应该由构造函数初始化(但不是因为未调用构造函数)。
这个故事的寓意:在您对 C 和 C++ 都有丰富的经验之前,不要混合使用它们。
我正在尝试使用一个结构 "students" 和另一个结构 "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);
这里是推送函数(一直让程序崩溃)
#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());
}
}
你在做:
ptrStack stack = (ptrStack)malloc(sizeof(Stack));
^^^^^
定义为:
typedef Stack *ptrStack;
因此,sizeof(Stack)
本质上是 size(pointer)
。您没有为结构分配足够的内存,而是为结构的指针分配了足够的内存。所以是的,您 运行 已分配内存
这个:
ptrStack stack = (ptrStack)malloc(sizeof(Stack));
分配了足够的内存来容纳 struct stack
a.k.a Stack
,但是 malloc()
没有做任何事情来初始化返回的内存。因此,特别是,您的新 stack
中的 string
包含随机垃圾,然后将由您的 cin >> s.name
解释并假定为有效的 string
,它不是,所以代码失败。
解决方案 - 使用 ptrStack stack = new Stack
代替。更好的是,编写适当的 constructors/destructors、复制构造函数、赋值运算符等...
问题是您混合使用了 C 和 C++,特别是在这行代码中
ptrStack stack = (ptrStack)malloc(sizeof(Stack));
Stack
结构包含一个 string
类型的对象。 string
构造函数 必须先调用 才能使用 string
。如果使用 C++ new
运算符分配内存,则会自动调用构造函数,并正确初始化 string
。
但是如果你使用Cmalloc
函数分配内存,那么string
构造函数是不是叫。 0xCDCDCDCD
来自字符串对象中未初始化的指针,该指针应该由构造函数初始化(但不是因为未调用构造函数)。
这个故事的寓意:在您对 C 和 C++ 都有丰富的经验之前,不要混合使用它们。