我正在玩记忆,这是一种学术活动,并试图像在汇编中那样将值写入内存,基本上是通过给它一个大小(1,2,4,8)以及一个值和一个内存地址,类似于:
movb $7, -1(%rbp) size=1; value=7, address=-1 (pretend rbp=0)
movw $777, -4(%rbp) size=2; value=777, address=-4
通过在C中执行此类操作,我是否需要创建多个具有不同大小的指针来进行此类随机大小的写操作?例如,当前我正在这样做:
char* play_mem_block(size_t bytes)
{
char *mem_block = malloc(bytes);
if (!mem_block) {
perror("Looks like there was an error");
return NULL;
}
// write a one-byte char value at address0
*mem_block = 'a';
// write a four-byte (int) value
int *mem_block_for_int = (int*) mem_block;
*(mem_block_for_int + 1) = 4444;
/* *(mem_block+3) = 4444; */ <-- possible to do this directly?
return mem_block;
}
你可以做:
*(int *)(mem_block + 4) = 4444; // only safe for aligned offsets
或者
((int *)mem_block)[1] = 4444;
为了按照需要编写,int
您需要一个类型表达式来int
进行编写,因此需要进行类型转换。
注意对齐,某些系统有对齐要求,根据平台的不同,尝试写一个int
at3
字节偏移量可能是不确定的。为了安全地进行未对齐写入,您将需要使用该memcpy
版本。
您的原始方法很好,并且可能更易于阅读,因此不要着急为此做一些不同的事情。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句