【问题标题】:How to preserve pointers between multiple method calls in C如何在C中的多个方法调用之间保留指针
【发布时间】:2016-02-23 15:54:00
【问题描述】:

我正在为命题逻辑编写一个解析器(不管那是什么,重点是我正在解析一种简单的语言),最初是从以下形式的函数开始的:

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。

问题是每次我尝试指针都会丢失 - 我知道这与堆栈(?)有关,并且当函数返回任何内容时指针会“死亡”。我没有尝试过数组,因为有人告诉我,数组静态工作效果最好,而这些数组的大小将是动态的(大小取决于变量的数量,仅在运行时找到)。

有什么办法可以做到这一点?我不能 malloc 任何东西,因为我无法释放它 - 在我能够释放它之前,需要返回 1 和 0 的序列。也许传递带有序列字段的结构,尽管我不确定这是否会遇到同样的问题。

非常感谢任何帮助。这是一个使用 C99 的程序。欢迎任何关于澄清的建议!

【问题讨论】:

  • C 不支持方法,只支持函数!并使用原型函数声明器。旧式的已弃用。
  • 为什么不能在工作完成后释放malloced 内存。不必在同一个函数中释放它。
  • "此外,数组在使用后仍然是指针。"不,它仍然是一个数组。如果它是一个指针,它将被称为“指针”。如果您对 C 概念有疑问,您应该在开始此级别的项目之前阅读 C 书籍。
  • @DanielSoutar 回到告诉你的那个人,然后用一些东西打他们。最好有尖尖的东西。
  • 这里的人有点迂腐。虽然数组只是一个连续的元素序列,但数组绑定的变量的值通常会在代码中隐式转换为指针类型。这就是为什么char string[] = "abc"; printf("%s\n", string); 起作用的原因。

标签: c parsing pointers recursion char


【解决方案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 */
}

【讨论】:

  • 我很抱歉。由于复制/粘贴错误,原始代码有很多问题。我相信它们现在都已修复。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-06-27
  • 2011-10-26
  • 2018-10-17
  • 1970-01-01
  • 2012-05-09
  • 2017-04-17
相关资源
最近更新 更多