4

C ++の配置構文に相当するものがCに存在しますか?つまり、Cの指定された場所にオブジェクトを作成できますか?そのために使用できrealloc()ますか?

4

4 に答える 4

11

newの配置は、単に割り当てをスキップし、事前に割り当てられたメモリにオブジェクトを作成します。Cにはコンストラクターがないため、新しい配置は必要ありません。ポインタを取得すると、オブジェクトが存在するかのように動作できるため、これに相当するのはポインタ型キャストだと思います。

一般的なメモリプールとは異なるタイプのオブジェクトを彫刻する例:

char *pool = (char *) malloc( 1000 );
char *pen = pool;

foo *obj1 = (foo *) pen;
pen += sizeof (foo);

bar *obj2 = (bar *) pen;
pen += sizeof (bar);

/* etc */

もちろん、これを行う際にはfree、C ++の新しい配置と同じように、に正しいポインタを渡し、配置要件を管理する責任があります。

于 2013-01-15T15:06:25.980 に答える
3

Cにはコンストラクターのようなものがないため、アドレスを取得して、使用する型へのポインターにキャストするだけです。もちろん、適切な配置を確保する必要があります。そうしないと、失敗する可能性があります(ただし、C ++の新しい配置でも同じことが言えます)。

于 2013-01-15T15:06:58.013 に答える
2

Cには「新しい配置」のようなものはありません。一方、ポインタを宣言して、メモリ内の任意のものを指すようにすることができます。

char *pointer = 0x12345678;

上記のポインタは、アドレスとして何でも指します0x12345678

これは、特定のデバイスがメモリ内の特定の場所にある組み込みシステムでよく使用されます。

于 2013-01-15T15:06:23.170 に答える
1

Cでポータブルな方法でこれを実現する一般的な方法は、次のとおりです。

#define X (*(int*)0x12345678u) // where 0x12345678 is a specific address 

// you can now use the int 'X' as any other type of variable:

X = 5;

if (X == SOMETHING)

これは、アドレス0x12345678に、intが収まる有効なメモリが含まれており、直接アクセスできることを前提としています。仮想メモリを備えたシステムでは、直接アクセスできない場合があります。

組み込みシステムでは、ハードウェアレジスタを定義するために上記のような宣言が一般的です。

于 2013-01-15T15:42:24.807 に答える