C - 递归体面表达式解析器喊出 zsh:分割错误



我正在尝试为基本表达式制作解析器,但出现分段错误

这是下面的完整代码

#include <stdlib.h>
#include <string.h>
#include <stdio.h>
struct Node {
char op;
int val;
struct Node *Left;
struct Node *Right;
};
void slice(char *source, char *dest, int s, int e) {
int n = 0;
for (int i = s; i < e; i++) {
dest[n++] = source[i];
}
dest[n] = '';
}
void parse_atom(char *expr, struct Node *Root) {
Root -> op = '=';
Root -> val = atoi(expr);
}
void parse_add(char *expr, struct Node *Root) {
for (int i = 0; i < strlen(expr); i++) {
if (expr[i] == '+') {
char p1[i], p2[strlen(expr) - i];
slice(expr, p1, 0, i);
slice(expr, p2, i, strlen(expr));
struct Node L, R;
Root -> op = '+';
Root -> Left = &L;
Root -> Right = &R;
parse_atom(p1, &L);
parse_add(p2, &R);
return;
}
}
parse_atom(expr, &Root);
}
int main() {
char *expr = "2+3";
struct Node Root;
parse_add(expr, &Root);
}

我不完全了解 c 中的内存管理,所以任何帮助将不胜感激,谢谢!

如果启用编译器警告,您将看到在调用parse_atom()时将指针传递到指向struct Node的指针:

parse_atom(expr, &Root);

虽然它只接受指向struct Node(https://godbolt.org/z/ud8-hX( 的指针:

void parse_atom(char *expr, struct Node *Root);

这会在clang上调用以下警告:

警告:将"结构节点 **"传递给 类型为"结构节点*"的参数;删除和 [-Win兼容指针类型]

parse_atom(expr, &Root);
^~~~~

:19:42:注意:在此处将参数传递给参数"根">

void parse_atom(char *expr, struct Node *Root( {

^

只需将指针本身传递为Root

parse_atom(expr, Root);

附加说明。看看这个代码:

struct Node L, R;
Root -> op = '+';
Root -> Left = &L;
Root -> Right = &R;

这是有效的,因为一切都在parse_add()函数范围内运行。 一旦你离开这个函数,LR的地址将指向无效的位置,因为这些对象将不再存在。

最新更新