我遇到了一个我无法弄清楚的分段错误。导致分段错误的函数如下所示:
Expression *IntegerLiteral_init(int intgr) {
Expression *the_exp = safe_alloc(sizeof(Expression));
the_exp->type = expr_IntegerLiteral;
the_exp->expr->intgr = intgr;
the_exp->exec_count = 0;
return the_exp;
}
定义了一个表达式:
typedef struct {
expr_type type;
u_expr *expr;
int exec_count;
} Expression;
u_expr 和 expr_type 被定义:
typedef union {
char *ident;
int intgr;
} u_expr;
typedef enum {
expr_Identifier,
expr_IntegerLiteral
} expr_type;
expr_type
是expr_IntegerLiteral
和的枚举expr_Identifier
。
根据GDB,段错误是由在线引起的:the_exp->expr->intgr = intgr;
. 奇怪的是,它并不总是导致段错误 - 如果我以这种方式调用函数,则会发生段错误:
Expression *e = IntegerLiteral_init(0);
但在我程序的另一部分,我使用以下方法调用它:
Expression *e;
...
e = IntegerLiteral_init(
(int)strtol(num_str, (char **)NULL, 10));
没有任何问题。num_str
已从某些输入中解析并具有值"0"
.
如果给定的参数相同,我不明白为什么我调用的上下文IntegerLiteral_init()
会影响是否发生此段错误。intgr
如果有人能对此有所了解,我将不胜感激。