Выполнение function_pointer, хранящегося в хеш-таблице с использованием qlibc, вызывает segfault

#c

#c

Вопрос:

Я сохраняю указатель на функцию в хеш-таблице с использованием qlibc. Когда я извлекаю указатель на функцию из хеш-таблицы и пытаюсь выполнить функцию, я получаю ошибку segfault. У меня такое ощущение, что размер, который я указываю, когда помещаю указатель на функцию в хеш-таблицу, возможно, неверен?

Вот код:

 #include <stdio.h>
#include <stdlib.h>
#include <qlibc/qlibc.h>

typedef struct my_struct_t MyStruct;

void my_function(void)
{
    printf("Executing my function!n");
}

typedef void (my_f_ptr)(void);

struct my_struct_t
{
    my_f_ptr *my_func_ptr;
};

int main(void)
{    
    MyStruct *ms = malloc(sizeof(MyStruct));

    ms->my_func_ptr = my_function;


    qhashtbl_t *ht = qhashtbl(0,0);
    int ret = ht->put(ht, "func", ms->my_func_ptr, sizeof(my_f_ptr));
    int size = (int)ht->size(ht);
    my_f_ptr *data = ht->get(ht, "func", NULL, false);

    data();  <---SEGFAULT HERE

    free(ms);
    return 0;
}
 

значение ret равно true, а размер хеш-таблицы равен 1, поэтому что-то было добавлено.

Если я попытаюсь поместить всю структуру в хеш-таблицу, используя следующий код, все будет в порядке:

 int ret = ht->put(ht, "func", ms, sizeof(MyStruct));
MyStruct *data = ht->get(ht, "func", NULL, false);
data->my_func_ptr();
 

но это не то, чего я хочу. Мне нужно сохранить указатель на функцию. Любая помощь будет высоко оценена.

Комментарии:

1. Я думаю, вы хотите sizeof(my_f_ptr*) в put вызове.

2. Пожалуйста, предоставьте struct my_struct_t

3. Является my_f_ptr ли тип my_func_ptr ? Пожалуйста, покажите нам.

4. struct my_struct_t можно найти выше в коде, в котором он находится: struct my_struct { my_f_ptr *my_func_ptr; };

5. Разве в typedef не отсутствует a * ? Для меня sizeof возвращает 1 для typedef и 8 для фактического указателя. При использовании typedef void (*my_f_ptr)(void) оба возвращают 8. Что sizeof(my_f_ptr) для вас?