実際のところ私は完全には不明ですが、一般的なポインタの使用に起因すると思われる私のコードでは、奇妙な動作が起こります。私はヒープに割り当てられているこれらの構造体要素の配列への静的ポインタを格納しています予期しないC構造体のポインタサイズの振る舞い
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の無知が輝いていますが、私はそれが100万点になると想像しています。誰も光を照らすことはできますか?
fe-> nameを割り当てるコードを表示する必要があります。ここに示すように、初期化されていないようです。 –
アドレスが変更されたように見える - 0xfe2d40!= 0x20049e0。私はMark Wilkinsに同意します - より多くのコード(特にPyAutoHastable_Getを参照する必要がありますが、その名前を設定するコードも疑わしい)です。 –
fe->名前の割り当てに追加されました。実際にはコードの大部分であるので、私のハッシュテーブルの実装全体を投稿したくはありません(問題なく長時間使用していますが)。 feに対して同じ値を返すという事実は、私にとってはそれほど疑わしいものではありません。 –