我有一个文件,我正在对其中的所有字符串进行标记。
因此每个令牌都存储在char *token = (char *) malloc(len + 1);
中。令牌在分配新令牌之前被释放,所以我需要一种方法来存储令牌以供进一步使用。
存储令牌的好策略是什么?我有一个函数,一次打印出一个单一的标记字符串。
我的问题不在于如何标记或解析,所以请忽略它的实现。我的问题是,我有一堆字符串在循环中多次分配和释放。那么我如何将每个分配存储在其他地方以供进一步使用?
答案 0 :(得分:0)
通常,令牌不会存储到文件中。当解析器准备好读取更多输入时,解析器会请求它们。
因此,令牌存储在程序堆的内存中,在处理它们之后(可能在文件完全解析之前很久),它们就被释放了。
---更新以遵循编辑---
如果您担心过度分配和解除分配,那么您有许多解决方案,具体取决于您尝试解决的问题的详细信息。
对于字符串,您可以通过“字符串构建器”界面创建它们,该界面检查字符串是否已存在于该文本中,如果是,则返回对已存在字符串的引用。请注意,要使其正常工作,所有返回的字符串必须是不可变的(因为更改一个引用中的字符串将更改所有引用中的字符串)。数字,布尔值等也可以使用类似的解决方案。
对于令牌重用,您可以将令牌变成一个结构,该结构主要通过指针引用解析器可能“使用”的数据。这样,解析器抓取令牌的“字段”,并且“骨架”令牌可以被添加回“重用队列”。重用队列应该在将令牌返回到令牌化器之前重置令牌的“数据”引用,这将被重写以询问队列的数据结构。如果“队列中没有令牌”,队列应该静默地分配它们。
其他解决方案也存在,取决于你想要的狡猾程度。