我目前正在开发一个链接列表,其中包含包含信息字符串的字符串。我使用的结构看起来像这样:
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.
在指针中将字符串分配给另一个字符串的正确方法是什么?或者我做错了什么?任何帮助,将不胜感激!
谢谢!
答案 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
不会这样做。