1

假设我在 C++ 中手动分配了很大一部分内存,比如 10 MB。

说实话,我想在这个区域的中间存储一些位。

我将如何获得那个位置的内存?

我知道访问原始内存的唯一方法是使用数组表示法。

4

5 回答 5

9

数组表示法适用于此,因为分配的内存可以看作是一个大数组。

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

char如果指针是另一种类型,我将类型转换为指针。如果它已经是一个char指针,则不需要类型转换。


如果您只想设置一个位,请将内存视为具有 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

数组表示法只是编写指针的另一种方式。您可以使用它,也可以像这样直接使用指针:

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

在 C/C++ 中,数组被视为指向其第一个元素的指针。因此,数组名只不过是其第一个元素的别名:

*pName is equivalent pName[0]

接着:

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

等等。括号用于避免优先级问题。永远不要忘记使用它们。

编译后,两种方式的行为相同。为了可读性,我更喜欢括号表示法。

于 2013-01-14T19:18:33.463 回答
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 回答