我正在为命题逻辑编写一个解析器(不重要的是,我的主要观点是解析一种简单的语言)并且最初从以下形式的函数开始:< / p>
int formula() {
int store = step;
if(compound())
return TRUE;
else {
if(atom())
return TRUE;
else if(negation() && formula())
return TRUE;
else {
step = store;
return FALSE;
}
}
}
int compound() {
int store = step;
if(open() && formula() && binary_operator() && formula() && close())
return TRUE;
else {
step = store;
return FALSE;
}
}
上面提到的功能是基本情况 - 这些是重要的部分。公式可以有子公式,而这些子公式又可以是复合公式,包含子公式,等等。
而不是整理,我试图返回1和0的字符序列(真和假)。如果返回序列,则表示输入可以生成序列(必须有效)。否则,返回null。
问题在于,每次我尝试指针都会迷路 - 我明白这与堆栈(?)有关,而指针类似于“死”&#39;当函数返回任何东西时。我没有尝试过数组,因为我被告知数组的静态效果最好,而这些数组的大小是动态的(大小由变量数决定,只能在运行时找到)。
这种方法有什么办法吗?因为我无法释放它所以我无法进行任何操作 - 在我能够释放它之前需要返回1和0的序列。也许通过带有序列字段的结构,虽然我不确定它是否会遇到同样的问题。
任何帮助非常感谢。这是一个使用C99的程序。任何有关澄清的建议都欢迎!
答案 0 :(得分:1)
我并不完全遵循你想做的事情,但没有明确的理由说明你为什么不能使用malloc。 malloc返回的指针稍后可以被另一个函数释放。请考虑以下有效代码:
char* foo(size_t* length)
{
*length = 3;
char* seq = malloc(*length);
seq[0] = 1;
seq[1] = 0;
seq[2] = 1;
return seq;
}
int main()
{
size_t length;
char* seq = foo(&length);
/* use seq */
free(seq);
}
如果您知道序列的上限,也可以在没有malloc
的情况下执行此操作。通过将指针传递给您在main()
堆栈上分配的空间,当函数退出时,您将不会丢失数据:
void foo(char* seq, size_t total_size, size_t* used_size)
{
*used_size = 3;
seq[0] = 1;
seq[1] = 0;
seq[2] = 1;
}
int main()
{
size_t used_size;
char seq[100];
foo(seq, sizeof(seq), &used_size);
/* use seq */
}