3

「最初に適合する」メモリ割り当てスキーマをシミュレートするソフトウェアを作成しています。

基本的に、私は大きな X メガバイトのメモリ チャンクを割り当て、スキーマに従ってチャンクが要求されたときにそれをブロックに分割します。

「ノード」と呼ばれるリンクされたリストをメモリの各ブロックのヘッダーとして使用しています (これにより、すべてのアドレス値を退屈にループすることなく次のブロックを見つけることができます.

head_ptr = (char*) malloc(total_size + sizeof(node));

if(head_ptr == NULL) return -1; // Malloc Error .. :-(

node* head_node = new node; // Build block header

head_node->next = NULL;
head_node->previous = NULL;

// Header points to next block (which doesn't exist yet)
memset(head_ptr,head_node, sizeof(node));

`

しかし、この最後の行は以下を返します:

 error: invalid conversion from 'node*' to 'int'

これが無効である理由は理解できますが、新しく割り当てられたメモリのポインタ位置にノードを配置するにはどうすればよいですか?

4

4 に答える 4

2
memset(void* memory, int value, size_t size)

したがって、をコピーするのではなくhead_node(head_ptrあなたが考えているmemcpy)、メモリを初期化するためです (0 にクリアする、解放済みとしてマークするなど...)。

この場合、単純に を にキャストできhead_ptrますnode*

node* head_node = (node*)head_ptr;

delete head_nodeそして今、値をコピーしたり、コピーしたりする必要はまったくありませんhead_ptr

于 2010-03-31T00:34:52.097 に答える
1

ドキュメントを読んでください。 は、2 番目のパラメーターmemsetとして int (ただし、 として解釈されます) を取ります。これは、メモリ領域の最初のバイト (は 3 番目のパラメータ)unsigned charに設定する値を指定します。nn

を使用するmemcpyと、メモリのある領域を別の領域にコピーできます。試す:

memcpy(head_ptr, head_node, sizeof(node));

編集:別の代替手段は、サイモンが提案したように、 head_ptr のポインターキャストを使用して前と次の値を設定することです。

于 2010-03-31T00:31:30.567 に答える
1

あなたの質問を正しく理解できれば、head_ptr によって割り当てられ、ポイントされるメモリにノード オブジェクトを構築する必要があります。ノード コンストラクターを呼び出す必要がある場合は、次のように配置 new演算子を介してこれを行います。

node* head_node = new(head_ptr) node;

デストラクタも確実に呼び出されるようにする必要がある場合は、delete を手動で呼び出す必要があります。

head_node->~node();
于 2010-03-31T00:38:15.590 に答える
0

そのようなポインターを割り当てることはできません。2 番目の引数はint繰り返されます。

からmemset(3):

あらすじ
     #include <string.h>

     空所 *
     memset(void *b, int c, size_t len);

説明
     memset() 関数は、値 c の len バイトを書き込みます (
     a. unsigned char) をバイト文字列に変換 b.

戻り値
     memset() 関数は、最初の引数を返します。
于 2010-03-31T00:33:15.423 に答える