#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)
для вас?