1

メモリの大部分、たとえば10MBを手動で割り当てたとします。

この地域の真ん中に数ビットを保存したいと思います。

その場所のメモリをどのように取得しますか?

生のメモリにアクセスすることを私が知っている唯一の方法は、配列表記を使用することです。

4

5 に答える 5

9

また、割り当てられたメモリは大きな配列と見なすことができるため、配列表記はそのために適切に機能します。

// Set the byte in the middle to `123`
((char *) memory_ptr)[5 * 1024 * 1024] = 123;

charポインターが別のタイプの場合に備えて、ポインターに型キャストします。すでにcharポインタである場合、型キャストは必要ありません。


1ビットのみを設定する場合は、メモリを8000万個の個別のビットを持つ巨大なビットフィールドと見なします。必要なビット、たとえばビット番号40000000を見つけるには、最初にそれが含まれているバイトを見つけ、次にビットを見つける必要があります。これは、通常の除算(文字を見つけるため)とモジュロ(ビットを見つけるため)で行われます。

int wanted_bit = 40000000;

int char_index = wanted_bit / 8;  // 8 bits to a byte
int bit_number = wanted_bit % 8;

((char *) memory_ptr)[char_index] |= 1 << bit_number;  // Set the bit
于 2013-01-14T18:56:07.217 に答える
7

配列表記は、ポインターを記述するもう1つの方法です。これを使用することも、次のように直接ポインタを使用することもできます。

char *the_memory_block = // your allocated block.
char b = *(the_memory_block + 10); // get the 11th byte, *-operator is a dereference.
*(the_memory_block + 20) = b; // set the 21st byte to b, same operator.

memcpy、、、およびその他も、次のように非常に役立つ場合がありmemzeroますmemmovememcmp

char *the_memory_block = // your allocated block.
memcpy(the_memory_block + 20, the_memory_block + 10, 1);

もちろん、このコードも同じです。

char *the_memory_block = // your allocated block.
char b = the_memory_block[10];
the_memory_block[20] = b;

そしてこれもそうです:

char *the_memory_block = // your allocated block.
memcpy(&the_memory_block[20], &the_memory_block[10], 1);

また、一方は他方より安全ではなく、完全に同等です。

于 2013-01-14T19:04:43.157 に答える
2

配列表記があなたの答えになると思います...ビットシフト演算子<<および>>をANDおよびORビットマスクとともに使用して、特定のビットにアクセスできます。

于 2013-01-14T18:56:51.830 に答える
1

配列表記を使用することも、ポインター演算を使用することもできます。

char* buffer = new char[1024 * 1024 * 10];

// copy 3 bytes to the middle of the memory region using pointer arithmetic
//
std::memcpy(buffer + (1024 * 1024 * 5), "XXX", 3); 
于 2013-01-14T18:58:23.590 に答える
1

C / C ++では、配列は最初の要素へのポインターとして扱われます。したがって、配列名は最初の要素のエイリアスにすぎません。

*pName is equivalent pName[0]

その後:

*(pName+1) == pName[1];
*(pName+2) == pName[2];

等々。括弧は、優先順位の問題を回避するために使用されます。それらを使用することを決して忘れないでください。

コンパイル後、どちらの方法も同じように動作します。私は読みやすさのために括弧表記を好みます。

于 2013-01-14T19:18:33.463 に答える