我正在尝试为基本表达式制作解析器,但出现分段错误
这是下面的完整代码
#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()
函数范围内运行。 一旦你离开这个函数,L
和R
的地址将指向无效的位置,因为这些对象将不再存在。