【问题标题】:Access Violation writing location 0xCDCDCDCD访问冲突写入位置 0xCDCDCDCD
【发布时间】:2015-08-15 06:18:21
【问题描述】:

我正在尝试使用一个结构“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());
}

}

【问题讨论】:

  • 不要在 C++ 中使用 malloc(除非你绝对知道你在做什么)
  • 您正在使用通过 malloc 或 new 分配的内存,但从未由应用程序写入 When and why will an OS initialise memory to 0xCD, 0xDD, etc. on malloc/free/new/delete?
  • C语言不包含cincout,所以你的C标签不合适。它们是同一种语言,尽管它们有相似之处。请仅使用与您提出的问题实际相关的标签;否则会破坏标签系统的目的。谢谢。

标签: c++ stack


【解决方案1】:

这个:

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

分配足够的内存来保存struct stack 又名Stack,但malloc() 不做任何事情来初始化返回的内存。因此,特别是,您的新stack 中的string 包含随机垃圾,然后您的cin &gt;&gt; s.name 将对其进行解释,并假定它是有效的string,但事实并非如此,因此代码失败.

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

【讨论】:

  • tyvm ^^ 我承认我混合了太多 C 和 C++,感谢您的帮助,我刚刚在 2 分钟内解决了一个我已经工作了 2 小时的问题!我完全忘记了字符串需要在创建阶段必须调用的自己的构造函数。
【解决方案2】:

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

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

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

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

故事的寓意:在对 C 和 C++ 都有丰富经验之前,不要混合使用。

【讨论】:

  • 啊,非常感谢 ^^ 解释了未初始化的指针问题 :) 是的,很多人说 C/C++ 是一样的,但是有一些很大的不同
【解决方案3】:

你在做:

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

定义为:

typedef Stack *ptrStack;

因此,sizeof(Stack) 本质上是size(pointer)。您没有为结构分配足够的内存,而是为结构分配了足够的内存给指针。所以是的,你分配的内存快用完了

【讨论】:

  • 那一行'typedefs'ptrStackStack 上面定义的不是struct stack 定义正确吗?
  • 这就是newmalloc 安全得多的原因:您不会弄错内存量,因为它是自动计算的。它看起来也更好。
  • 或只是sizeof(stack)。 C/C++ 区分大小写。 stack != Stack.
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-09-04
  • 2012-12-05
  • 2013-04-15
  • 1970-01-01
相关资源
最近更新 更多