3

これはばかげた質問のように感じますが、私はきれいな解決策を見つけることができず、他のポインタ関連の質問の大部分で同様の質問を見つけることができません。

未知のタイプの動的に割り当てられたメモリがあり、最初にその中にポインタを格納したいと思います。mallocによって返される動的メモリは適切に整列されている必要があるため、割り当てられたブロックの先頭に書き込むときに整列について心配する必要はないと思います。

これは私のコードであり、機能しますが、ポインターを64ビット整数として表現しており、よりクリーンでポータブルな方法でそれを実行したいと考えています。

void *my_area = malloc(512);
void *my_pointer = get_my_pointer();
((long long *) my_area)[0] = (long long) my_pointer;
4

3 に答える 3

2

キャスト先long longは追加の荷物です。void *代わりにキャストしてください。

void *my_area = malloc(512);
void *my_pointer = get_my_pointer();
((void **) my_area)[0] = my_pointer;

(これはある種のフリーリストなどのためのものだと思います。つまり、構造を同時に使用する必要はありません。)

于 2012-11-07T17:13:04.553 に答える
1

そこにあるのmy_area[0]は何かへのポインタですよね?

次に、my_areaをタイプに割り当てることができますvoid **。これは、メモリ領域を含むポインタへのポインタを表します。

void **my_area = malloc(512 * sizeof(*my_area)); // alloc 512 pointer sized memory blocks
void *my_pointer = get_my_pointer();
my_area[0] = my_pointer;
于 2012-11-07T17:09:16.893 に答える
0

8バイトの内部配列で構造体を定義します。すべてのlonglong型参照をカスタム構造体に置き換えます。このようにして、longlongのプラットフォーム固有のサイズに依存することはありません。構造体はすべてのプラットフォームで64ビットになります(配置が心配な場合は#pragma packを追加できます)

于 2012-11-07T17:14:07.800 に答える