我的代码中有一些奇怪的行为,这似乎是由于使用了通用指针而导致的,尽管我真的完全不确定。我有一个相当标准的结构,如下所示:
typedef struct {
char* name;
PyAutoCFunc ac_func;
void (*func)();
PyAutoType type_id;
int num_args;
PyAutoType arg_types[MAX_ARG_NUM];
} func_entry;
static func_entry* func_entries;
我正在存储一个静态指针,指向在堆上分配的这些结构元素的数组。在我创建这个数组的一个新元素并插入它的时候,它的值看起来像这样......
func_entry new_fe;
new_fe.name = malloc(strlen(name) + 1);
strcpy(new_fe.name, name);
... // Init rest of struct
func_entries[num_func_entries] = new_fe;
num_func_entries++;
func_entry* fe = &func_entries[num_func_entries-1];
printf("Setting function '%s' at address '%p', name address '%p'\n", name, fe, fe->name);
这输出。
>>> Setting function 'graphics_viewport_set_title' at address '0xfe2d40', name address '0xe40fe0'
注意 fe->name 的大小和值。然后我将此指针存储到哈希表中以供稍后检索。在哈希表中,它被存储为一个简单的 void*。后来当我从哈希表中检索指针时,发生了一件奇怪的事情。
func_entry* fe = PyAutoHashtable_Get(func_table, c_func_name);
printf("Getting function '%s' at address '%p', name address '%p'\n", c_func_name, fe, fe->name);
哪个输出。
>>> Getting function 'graphics_viewport_set_title' at address '0xfe2d40', name address '0x6e6f74656c656b73'
fe 的地址显然已经毫无问题地进出哈希表,但是 fe->name 的大小和地址发生了变化。更奇怪的是,fe->name 的大小与之前不同,甚至与 fe 的大小不同。尝试访问 fe->name 会给我一个段错误,我不确定如何继续。
出于兴趣,当我在具有多个链接库的应用程序中使用代码时,似乎会发生这种情况,我相当确定我正在运行的所有代码都是 64 位的。
我已经在一个单独的应用程序中成功运行了上面的代码,并获得了一个正确的 fe->name 指针(一个较小的指针)。
我也在 Ubuntu Linux 64 位上运行并使用 gcc 进行编译。
这确实是我对 C 的无知的地方,尽管我想象它可能是一百万件事。任何人都可以发光吗?