У меня возникла ошибка сегментации, которую я не могу понять. Функция, которая вызывает ошибку сегментации приведен ниже:Ошибка сегментации - 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, segfault вызывается на линии: the_exp->expr->intgr = intgr;
. Как ни странно, это не всегда приводит к Segfault - выдаёт ошибку сегментации происходит, если я вызываю функцию таким образом:
Expression *e = IntegerLiteral_init(0);
Но в другой части моей программы, я называю его помощью:
Expression *e;
...
e = IntegerLiteral_init(
(int)strtol(num_str, (char **)NULL, 10));
который работает без проблем. num_str
был разобран с некоторого ввода и имеет значение "0"
.
Я не понимаю, почему контекст, в котором я звоню IntegerLiteral_init()
, должен влиять на то, происходит ли этот segfault или нет, если данный параметр intgr
тот же. Если бы кто-нибудь мог пролить свет на это, я был бы очень благодарен.
Вы должны просто изменить выражение «выражение», чтобы сохранить значение «u_expr», а затем использовать оператор ссылочной структуры '.' вместо оператора разметки структуры' -> '. то есть 'the_exp-> expr.intgr = intgr;' – simonc
Спасибо, миллион, он работает сейчас.Не только это, вы исправили недоразумение, которое я имел о союзах. – AlexJ136