2015-06-01 90 views
0

我正在尝试使用一个结构“学生”和另一个结构“堆栈”来制作一个小链表,该结构包含学生结构和指向下一个元素的指针。访问冲突写入位置0xCDCDCDCD

但是我不断地收到一个存储器访问错误。我双检查,以确保所有的指针被初始化(只有一个指针,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); 

这里是推送功能(这使崩溃的PROGRAMM)

#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()); 
} 

}

+2

不要在C++中使用malloc – Borgleader

+0

您正在通过malloc或new使用已分配的内存,但从未由应用程序编写[何时以及为什么OS将内存初始化为0xCD ,0xDD等malloc/free/new/delete?](http://stackoverflow.com/q/370195/995714) –

+0

C语言不包含'cin'或'cout',所以你的C标签是不适当。即使它们有相似之处,它们也不是*相同的语言。请仅使用与您要问的问题实际相关的标签;否则会破坏标签系统的用途。谢谢。 –

回答

5

这结束:

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

分配足够的内存来容纳struct stack a.k.a Stack,但malloc()没有做任何事情来初始化返回的内存。因此,特别是,您的新stack中的string包含随机垃圾,该垃圾将被您的cin >> s.name解释,并被假定为有效的string,事实并非如此,因此代码失败。

解决方法 - 使用ptrStack stack = new Stack代替。更妙的是,写正确的构造函数/析构函数,拷贝构造函数,赋值运算符等......

+0

tyvm ^^我承认我混合了一点C和C++,谢谢你的帮助,我刚刚在2分钟内解决了一个问题,一直工作了2个小时!我完全忘记了在创建阶段需要自己的构造函数的字符串。 –

1

你这样做:

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

其定义为:

typedef Stack *ptrStack; 

因此,sizeof(Stack)基本上是size(pointer)。你没有为你的结构分配足够的内存,你为POINTER分配足够的内存给你的结构。所以,是的,你运行了你分配的内存

+0

typedef struct stack Stack; <<堆栈看起来不错? – willll

+0

该行'typedefs''ptrStack'。上面定义的'Stack'不是'struct stack',它的定义是否正确? – Persixty

+1

这就是为什么'new'比'malloc'更安全的原因:你不能得到错误的内存量,因为它是自动计算的。它看起来也很漂亮。 – edmz

3

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

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

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

但是,如果你使用的是C malloc功能分配内存,那么string构造是调用。 0xCDCDCDCD来自应该由构造函数初始化的字符串对象中的未初始化指针(但不是因为未调用构造函数)。

故事的寓意:不要混用C和C++,除非你在两者中都有很多经验。

+0

非常感谢你^^解释未初始化的指针问题:) 是啊,很多人说C/C++是相同的,但有一些激烈的差异 –

+0

不客气,很高兴我可以帮助:) – user3386109