如何在C语言中从“原始”内存中读取/写入类型值?

8
我该如何使这样的事情起作用呢?
void *memory = malloc(1000);  //allocate a pool of memory
*(memory+10) = 1;  //set an integer value at byte 10
int i = *(memory+10);  //read an integer value from the 10th byte
3个回答

7

一个简单的例子:把内存看作无符号字符数组。

void *memory = malloc(1000);  //allocate a pool of memory
uint8_t *ptr = memory+10;  
*ptr = 1 //set an integer value at byte 10
uint8_t i = *ptr;  //read an integer value from the 10th byte

您也可以使用整数,但是您必须注意一次设置的字节数量。

能否通过将void指针转换而不是创建“中间”类型指针来实现这一点? - dtech
当然,出于清晰明了的目的,我使用中间表示。 - ziu

5
规则很简单:
- 每个指针类型(函数指针除外)都可以在不丢失数据的情况下转换为void*,反之亦然。 - 不能对void*指针进行指针算术运算,也不能对其进行解引用操作。 - sizeof(char)等于1,根据定义;因此增加char指针意味着将“1”添加到“原始”指针值中。
由此可以得出结论,如果要执行“原始”指针算术运算,则必须将其转换为char*。

3

所以,“工作”是指“如何对 void* 进行取消引用/执行指针算术运算?”吗?你不能这样做;你必须将其转换,通常转换为 char*,如果你只关心读取内存块。当然,如果是这种情况,最好一开始就声明它为 char*


@ddriver:这并没有改变什么。你必须进行指针转换。当类型未知时,你期望解引用和/或算术运算的结果是什么?这毫无意义。你需要传递额外的信息来了解底层类型是什么。 - Ed S.

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接