首页 > 解决方案 > 可以使用单个指针将各种类型的值写入内存地址吗?

问题描述

我将内存作为一种学术练习来玩,并尝试将值写入内存,就像我在汇编中所做的那样,基本上是通过给它一个大小 (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;

}

标签: cpointersassemblymalloc

解决方案


这是一个更接近您的目标的改编:

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);
}

这同样微不足道。


推荐阅读