0

メモリ プールとして機能している大きな char 配列があり、プール内の次の開いている位置を指す配列の最初の位置にポインターを格納したいので、何かがプールに割り当てられるたびにポインター割り当てられたばかりのバイトに続くバイトを指します。私の唯一の問題は、ポインターが存在する唯一の場所が配列[0]の位置にあるため、ポインターを配列に格納してから他の関数​​で変更できる方法がよくわからないことです。誰かがこれについて正しい方向に私を向けることができますか?

char 配列は次のように宣言されます。

char pool[size];
4

4 に答える 4

1

本当に必要なのは、挿入する場所を示すその配列へのインデックスです。

構造体を宣言できます:

struct pool
{
    char poolData[size];
    int insertIndex;
};

一緒に挿入したいプールメモリとインデックスを常に持つようにします。または、別の変数を用意して、それを使用する必要がある人に一緒に渡します。

char pool[size];
int insertIndex;

配列の最初の要素を「ハイジャック」して、配列の残りの要素とは異なる方法で使用する必要はありません。プールの状態を追跡する別の変数を宣言するだけです。

于 2013-02-25T05:23:37.513 に答える
0

必要なのは、プールの次の空の場所がどこにあるかを覚えておくためのインデックスだと思います(最初はゼロになります)。

char pool[size];
int index = 0;

次に、新しい要素を挿入するたびに、それをインクリメントするだけです。

if(index < size) {
  pool[index] = 123;
  index++;
}
于 2013-02-25T05:27:38.477 に答える
0

プールを使用してすべての情報を格納する必要があるため、他の回答の推奨事項に従えない場合は、整数情報を文字配列に格納する最も安全な方法を使用するmemcpyことです (私は C++11 を使用しています)。構文):

#include <cstring>
#include <iostream>

int main()
{
  using size_type = std::size_t;
  static constexpr size_type size = 1000;
  char pool[size];

  /* Store 12 as integer information at the beginning
     of the pool: */    
  size_type next_free = 12;
  std::memcpy(pool,&next_free,sizeof(size_type));

  /* Retrieve it: */
  size_type retrieved = 0;
  std::memcpy(&retrieved,pool,sizeof(size_type));

  /* This will output 12: */    
  std::cout << retrieved << std::endl;

  return 0;
}

もちろん、これsizeof(size_type)は、プールの最初のエントリを実際の文字の格納に使用してはならないことを意味します。実際に使用できる最低のエントリは ですpool[sizeof(size_type)]

于 2013-02-25T05:38:19.343 に答える
0
char **pPoolEnd = (char **) pool;

必要なポインターを初期化します。

*pPoolEnd = pool + sizeof(char **);

独自の目的を示すようにします (たとえば、プールに他に何もない場合)。

しかし、なぜあなたはこれをしたいのですか?紛らわしく、エラーが発生しやすく、おそらく不必要です。他の人は、はるかに優れた代替案を指摘しています。そもそもそのようなプールがあると仮定すると、おそらくそれらのいずれかを使用するか、単に別のポインターchar *poolEndpool.

また、実装の詳細をユーザーに公開するのはスタイルが悪く (「プール エンド ポインターはプール [0] にあります」)、ユーザーがそれらを処理することを期待する (「割り当てたいときはいつでもプール [0] を更新してください」) のはさらに悪いことです。プールから」)。考えmallocてみてくださいfree。シンプルな関数インターフェイスをユーザーに公開します。

于 2013-02-25T05:57:30.773 に答える