gpt4 book ai didi

将具有动态数组的结构转换为双指针

转载 作者:行者123 更新时间:2023-11-30 18:12:41 25 4
gpt4 key购买 nike

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

最佳答案

我现在使用以下代码解决了问题 - 感谢我在评论中得到的任何帮助和好的建议。

结构定义:

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;

使用结构体的代码

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();
}

关于将具有动态数组的结构转换为双指针,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32625166/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com