假设我已经在C ++中手动分配了大部分内存,比如10 MB。
说出来,我想在这个区域的中间存储一些位。
我如何获得该位置的记忆?
我知道访问原始内存的唯一方法是使用数组表示法。
答案 0 :(得分:9)
数组符号效果很好,因为分配的内存可以看作是一个大数组。
// Set the byte in the middle to `123`
((char *) memory_ptr)[5 * 1024 * 1024] = 123;
如果指针属于另一种类型,我会转向char
指针。如果它已经是char
指针,那么就不需要进行类型转换。
如果您只想设置一个位,请将存储器视为具有8000万个独立位的巨型位字段。要找到所需的位,比如位号40000000,首先必须找到它所在的字节,然后找到该位。这是通过正常除法(找到char)和modulo(找到位)来完成的:
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
答案 1 :(得分: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
,memmove
,memcmp
和其他人也可能非常有用,例如:
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);
另外,一个并不比另一个更安全,它们完全相同。
答案 2 :(得分:2)
我认为数组符号将是你的答案......你可以使用bitshift运算符&lt;&lt;和&gt;&gt;使用AND和OR位掩码访问特定位。
答案 3 :(得分: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);
答案 4 :(得分:1)
C / C ++,数组被视为指向其第一个元素的指针。 因此,数组名称只是其第一个元素的别名:
*pName is equivalent pName[0]
然后:
*(pName+1) == pName[1];
*(pName+2) == pName[2];
等等。括号用于避免优先级问题。永远不要忘记使用它们。
编译后,两种方式的行为都相同。 为了便于阅读,我更喜欢括号表示法。