将带有动态数组的struct转换为双指针

时间:2015-09-17 07:53:56

标签: c pointers

我有一个数据结构,其中包含一些动态大小的字段。 即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();
}

2 个答案:

答案 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");

但是我需要你提供更多信息,警告是什么,并告诉我你如何申报和访问你的结构。