c - 可以使用单个指针将各种类型的值写入内存地址吗?
问题描述
我将内存作为一种学术练习来玩,并尝试将值写入内存,就像我在汇编中所做的那样,基本上是通过给它一个大小 (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;
}
解决方案
这是一个更接近您的目标的改编:
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 address 0
char a = 'a';
memcpy(mem_block, a, sizeof(a));
// write a four-byte (int) value
int ffffour = 4444;
memcpy(mem_block + 1, &ffffour, sizeof(ffffour));
return mem_block;
}
在实践中,您将希望创建某种用于分配的“缓冲区”处理程序,然后是这样的辅助方法:
void* write_int32_t(void* b, int32_t n) {
memcpy(b, &n, sizeof(n));
return b + sizeof(n);
}
您可以在其中为您需要写出的每种类型删除该变体。你也可以写一个逆read_int32_t
方法:
void* read_int32_t(void* b, int32_t* n) {
memcpy(n, b, sizeof(n));
return b + sizeof(n);
}
这同样微不足道。
推荐阅读
- java - 如何循环遍历SQLl表t
- javascript - 如何隐藏存储在 javascript 文件中的密码以使用 PDF.JS 打开 PDF 文件?
- python - scipy.curve_fit 产生 [1.] 作为答案
- azure - Azure 函数 - 服务总线主题触发器 - 本地调试间歇性地停止工作一段时间
- python - 如何查看数组中一个字符串中的第一项/最后一项是否与 python 中数组中另一个字符串中的第一项/最后一项对齐?
- linux - 使用 Linux 多次重复每一行
- python -
在蟒蛇 - javascript - axios.get 来自 Mysql DB 的数据。Vue.js,Laravel
- c++ - 无法使用 loadlibrary (C++) 卸载注入的 dll
- python - Python将索引转换为日期时间和ValueError:('字符串不包含日期:','')