如何在C中保留多个方法调用之间的指针

时间:2016-02-23 15:54:01

标签: c parsing pointers recursion char

我正在为命题逻辑编写一个解析器(不重要的是,我的主要观点是解析一种简单的语言)并且最初从以下形式的函数开始:< / 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的程序。任何有关澄清的建议都欢迎!

1 个答案:

答案 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 */
}