Я работаю над рефакторингом старого кода в C. У меня есть эта структура:
struct example_opt_t
{
const char *name;
const char *value;
};
, и я хочу инициализировать свои параметры (имя, значение), чтобы я мог передать его в функцию init
.
Это объявление init()
:
struct lh_ctx_t *init( const struct example_clb_t *callbacks, void *user_data, const struct example_opt_t *options ) {
И это моя попытка инициализировать options
:
const struct example_opt_t my_options[2] = {
(struct example_opt_t){
"option1_name",
"option1_value",
},
(struct example_opt_t){"option2_name",
"option2_value"},
};
Но я получаю ошибку segfault , Что я здесь не так делаю?
[ОБНОВЛЕНИЕ]:
init
в какой-то момент вызывает следующую функцию:
if ( example_strcasecmp( option->name, name ) ) return false;
, тело которой:
int example_strcasecmp( const char *s1, const char *s2 ) {
int diff;
if ( s1 == NULL || s2 == NULL ) return 0;
/* I'm getting a segfault at the line below*/
do { diff = example_lowercase(s1++) - example_lowercase(s2++); }
while ( diff == 0 && s1[-1] != '\0' );
return diff;
}
И example_lowercase
- это:
int example_lowercase( const char *s ) {
return tolower( *(const unsigned char *)s );
}
Странно то, что я все еще получаю segfault, но теперь я не могу увидеть точную строку, которая генерируется, так как gdb вывод ниже:
Program terminated with signal SIGSEGV, Segmentation fault.
#0 0x000055aace859039 in ?? ()
(gdb) bt
#0 0x000055aace859039 in ?? ()
#1 0x000055aacf4b6268 in ?? ()
#2 0x000055aace85671a in ?? ()
#3 0x00007ffe39cd0e34 in ?? ()
#4 0x000055aacf4b6268 in ?? ()
#5 0x00007ffe39cd0f40 in ?? ()
#6 0x00007ffe39cd0f20 in ?? ()
#7 0x00007ffe39cd0e34 in ?? ()
#8 0x000055aace857f6f in ?? ()
#9 0x000055aacf4b6268 in ?? ()
#10 0x5d4ca731752bb200 in ?? ()
#11 0x00007ffe39cd0f20 in ?? ()
#12 0x000055aacf4b6268 in ?? ()
#13 0x0000000000000000 in ?? ()