【发布时间】:2017-08-05 06:12:17
【问题描述】:
对于下面的代码,我将读取令牌,例如, x、y 和 z,并将它们分配到令牌的词位列表中。代码如下:
int parse_varlist(void)
{
token = lexer.GetToken();
char* lexeme = (char*)malloc(sizeof(token.lexeme) + 1);
memcpy(lexeme, (token.lexeme).c_str(), (token.lexeme).size() + 1);
addList(lexeme); //This function is used to add tokens' lexeme into a
list
if (token.token_type == ID) //ID is token's type
{
token = lexer.GetToken(); //read next token
parse_varlist(); //let parse_varlist() call itself to add
tokens' lexeme into list
printList(); // print list of token's lexeme
}
else {
cout << "\n Syntax Error \n";
}
free(lexeme);
return(0);
}
// this is the code of addList():
void addList(char* lexeme) {
if (symbolTable == NULL) {
sTable* newEntry = (sTable *)malloc(sizeof(sTable));
sTableEntry* newItem = (sTableEntry *)malloc(sizeof(sTableEntry));
newItem->name = lexeme;
newEntry->next = NULL;
newEntry->prev = NULL;
symbolTable = newEntry;
}
假设我们要读取 x, y 并将它们的词位存储到列表中。目前,我可以获得这两个令牌。但是,在调用 printList() 之后,我的列表中只能有 x。
我在网上查看了可能的解决方案。我可以使用 calloc() 而不是 malloc() 来分配这些内存吗? 但是,对于我要创建的列表,我是将内存分配到单个块还是多个块中?因为这是 calloc() 和 malloc() 之间的一个重要因素:
【问题讨论】:
-
您是在编程 C 还是 C++?它们是两种截然不同的语言,因此请仅使用一种语言标签。
-
@Someprogrammerdude 他使用的是 C++,但看起来几乎完全是 C。
-
关于链接图像中的最后一点,您可能需要阅读Do I cast the result of malloc?(这是特定于 C 的,C++ 是 不同这就是为什么使用正确的标签如此重要)。
-
如果你用 C++ 编写,你不应该使用
malloc()。如果您使用 C 语言编写,则不应使用cout << "\nSyntax Error\n";(并且不应在输出行的开头和结尾处放置空格)。因此,您决定使用哪种语言至关重要,而且,AFAIK,alloc()不是标准功能 - 您需要确定您正在使用哪个库(文档的 URL 会很好)。 -
我不知道您在哪里找到该表,但该表第一行中的错误信息令人震惊。这是错误的。大错特错。它背后有一些真相,但它更具误导性而不是帮助。
calloc()分配单个内存块,但该块的大小以“项目数”和“每个项目的大小”来描述。 (英语的使用有很多不足之处,int ptr;Ptr = calloc(…);的使用也很糟糕;C 和 C++ 都是区分大小写的语言。)我建议忽略该表的来源,因为它提供了有用的信息。跨度>
标签: c++ memory-management