我已經得到分割故障,我想不通。下面示出的是使段錯誤的功能:段錯誤 - GNU C
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
參數相同。如果任何人能夠闡明這一點,我將非常感激。
你應該能夠只是改變'Expression'舉行'按值u_expr'然後使用結構引用操作符'.'到位結構引用操作'的 - >'。即'the_exp-> expr.intgr = intgr;' – simonc
非常感謝,它現在正在工作。不僅如此,你糾正了我對工會的誤解。 – AlexJ136