尝试创建包含字符串C ++的链接列表

时间:2013-04-01 19:15:35

标签: c++ string pointers linked-list

我目前正在开发一个链接列表,其中包含包含信息字符串的字符串。我使用的结构看起来像这样:

struct symbolTable
{
    string lexeme;
    string kind;
    string type;
    int offSet;
    symbolTable *nextSymbol;
    symbolTable *nextTable;
};

insert函数看起来有点像这样:

void MPParser::insertToSymbolTable(string identifier, string type, string kind)
{
    tempOffset++;
    symbolTable *tempNode;
    tempNode = (symbolTable*)malloc(sizeof(symbolTable));
    tempNode->kind = kind; //Run Time error Here..
    tempNode->type = type;
    tempNode->lexeme = identifier;
    tempNode->offSet = tempOffset;
    tempNode->nextTable = NULL;
    tempNode->nextSymbol = root;
    root = tempNode;
}

程序编译然后当我尝试运行并插入链表时,我收到此错误:

Unhandled exception at 0x5A6810D0 (msvcr110d.dll) in mpcompiler.exe: 0xC0000005: Access   violation writing location 0xCDCDCDCD.

在指针中将字符串分配给另一个字符串的正确方法是什么?或者我做错了什么?任何帮助,将不胜感激!

谢谢!

3 个答案:

答案 0 :(得分:2)

使用new代替malloc(),以便正确构造字符串对象:

tempNode = new symbolTable;

然后在需要稍后释放节点时使用delete

delete node;

答案 1 :(得分:2)

尝试用

替换您的代码
void MPParser::insertToSymbolTable(string identifier, string type, string kind)
{
    tempOffset++;
    symbolTable *tempNode;
    tempNode = new symbolTable;
    tempNode->kind = kind; //Run Time error Here..
    tempNode->type = type;
    tempNode->lexeme = identifier;
    tempNode->offSet = tempOffset;
    tempNode->nextTable = NULL;
    tempNode->nextSymbol = root;
    root = tempNode;
}

Access Violation表示您正在写入未分配的内存。并且您绝不能在C ++中使用malloc,因为它不会调用constructors,始终使用new来创建动态对象,而使用delete来释放它们。

答案 2 :(得分:1)

我在gcc 4.5.3下做了一个非常简单的测试:

#include <iostream>
#include <string>

struct A
{
  std::string a;
};

int main()
{
   A* ptr = new A;
   ptr->a = "hello";
   std::cout << ptr->a << std::endl;

   //A aStruct;
   A* ptr2 = (A*)malloc(sizeof(A));
   //ptr2 = &aStruct;
   ptr2->a = "hello again";   //simulate what you have done in your code
   std::cout << ptr2->a << std::endl;
   std::cin.get();
};

这会导致核心转储,因为ptr2试图访问原始内存。但是,如果我取消注释:

//A aStruct;
//ptr2 = &aStruct;

然后按预期工作。因此,您应该使用new而不是malloc。原因是new将调用类的构造函数来初始化分配的内存块,但是malloc不会这样做。