我有一个数据结构,其中包含一些动态大小的字段。
即void *methods[0]
我也将它们声明为void *methods[]
,但这似乎也是错误的,因为它不应该是结构中唯一的字段。
这个结构只是为了读取在其他地方定义的内存,所以我不能在itable_t / itt_t中添加方法的大小,并将方法/条目定义为动态。
以下代码有效,但请给我一些我不想要的警告。
struct itable_t {
void *methods[0];
};
typedef struct itable_t itable_t;
struct itt_entry_t {
itable_t *itable;
void *id;
int32_t prev;
int32_t next;
};
typedef struct itt_entry_t itt_entry_t;
struct itt_t {
itt_entry_t entries[0];
};
typedef struct itt_t itt_t;
struct vtable_t {
rtti_t *rtti;
itt_t *itt;
void *dynamic_methods[];
};
typedef struct vtable_t vtable_t;
struct object_t {
vtable_t *vptr;
};
typedef struct object_t object_t;
所以我尝试将结构翻译成以下内容,这似乎不正确,因为我遇到了一些分段错误
struct itt_entry_t {
void **itable;
void *id;
int32_t prev;
int32_t next;
};
typedef struct itt_entry_t itt_entry_t;
struct vtable_t {
rtti_t *rtti;
itt_entry_t **itt;
void *dynamic_methods[];
};
typedef struct vtable_t vtable_t;
struct object_t {
vtable_t *vptr;
};
typedef struct object_t object_t;
我应该如何定义和访问我的结构,以便它们起作用?
编辑:当前结构的使用方式: 该函数从汇编程序
调用movl %edi, (%esp)
movl $itable_table_name_815, 4(%esp)
movl $0x4, 8(%esp)
call oo_searched_itable_method
c功能
void *oo_searched_itable_method(const object_t *obj, void *interface_id, int32_t offset)
{
itt_t *itt = obj->vptr->itt;
int32_t i = 1;
do {
if (itt->entries[i].id == interface_id) {
return itt->entries[i].itable->methods[offset];
}
}
while (itt->entries[++i].id != NULL);
// should never happen
abort();
}
答案 0 :(得分:0)
我现在用以下代码解决了这个问题 - 感谢您在评论中提供的任何帮助和建议。
结构定义:
struct itt_entry_t {
void **itable;
void *id;
int32_t prev;
int32_t next;
};
typedef struct itt_entry_t itt_entry_t;
struct vtable_t {
rtti_t *rtti;
itt_entry_t *itt;
void *dynamic_methods[];
};
typedef struct vtable_t vtable_t;
struct object_t {
vtable_t *vptr;
};
typedef struct object_t object_t;
使用structurs
的代码void *oo_searched_itable_method(const object_t *obj, void *interface_id, int32_t offset) {
itt_entry_t *itt = obj->vptr->itt;
int32_t i = 1;
do {
if (itt[i].id == interface_id) {
return itt[i].itable[offset];
}
}
while (itt[++i].id != NULL);
fprintf(stderr, "ITable not found...");
abort();
}
答案 1 :(得分:-1)
据我所知,我宣布这样的结构:
typedef struct s_data
{
char *str;
int foo;
} t_data;
现在在您的代码中,您需要通过这种方式声明它:
t_data my_struct;
my_struct.foo = 8;
my_struct.str = malloc(4 * sizeof(char));
my_struct.str = strcpy(my_struct.str, "foobar");
但是我需要你提供更多信息,警告是什么,并告诉我你如何申报和访问你的结构。