私のコードでは、ジェネリック ポインターを使用した結果と思われる奇妙な動作が発生していますが、実際にはまったく不明です。次のようなかなり標準的な構造体があります。
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 にアクセスしようとすると segfault が発生し、どうすればよいかわかりません。
興味深いことに、いくつかのリンクされたライブラリを含むアプリケーションでコードを使用すると、これが発生するようです。実行しているすべてのコードが 64 ビットであると確信しています。
別のアプリケーションで上記のコードを正常に実行し、fe->name (小さい方) の正しいポインターを取得しました。
また、Ubuntu Linux 64 ビットで実行し、gcc でコンパイルしています。
これは本当に私のC無知が輝くところですが、私はそれが何百万もの可能性があると想像しています. 誰でも光を当てることができますか?