用C中的指针覆盖内存

时间:2015-03-30 21:11:06

标签: c

我对我最近的代码有疑问。

我正在编写一种方法,将一个内存块(其开始由一个指针表示)复制到另一个内存块,其开始由另一个指针表示。方法是这样的:

void copyMem(const uint8_t* const base, uint32_t start, 
                            uint32_t end, uint32_t length) {
for(uint32_t x = 0; x < Length; x++) {
    *(base + end + x) = *(base + start + x);
}
}

“base”是指内存块的开始,“start”和“end”是指该块内的部分(因此,如果base是21353646,则“start”可能是10,这将是参考213536 5 6,结束可以是20,这将指213536 6 6)。

我的前提条件指出内存不重叠,所以我不需要担心。上面是我尝试编写将内存块从“开始”复制到“结束”的内容,但它失败了,给我一个错误,即它是一个只读位置的赋值。我认为我理解的是因为base是const,所以我实际上无法修改它。

但是,如果我不能在第一时间修改内存,我该如何覆盖内存部分呢?

2 个答案:

答案 0 :(得分:2)

  

但是,如果我不能在第一时间修改内存,我该如何覆盖内存部分呢?

简单:删除第一个const。 它说你指向的记忆是不变的......显然你不能修改它。

如果你想要const是正确的,你可以采用memcpy方式,并指向非常量内存作为目标,并指向常量内存作为源。

另外:你为什么不简单地使用memcpy?在大多数情况下,编译器将通过特定处理器/操作系统替换memcpy,这将比您可能提出的大多数琐碎解决方案更有效地复制数据。

最后但并非最不重要的是你可以抛弃函数内部的const, 虽然我不建议这样做。恕我直言,最干净的方法是首先使用memcpy。

答案 1 :(得分:1)

void memcpy(void *dst, void *src, int len) {
     for (int i = 0; i < len; i++)
         *(uint8_t *)dst++ = *(uint8_t *)src++
}

要打电话:

memcpy(addr1 + offset1, addr2 + offset2, len);

它与您在代码示例中显示的参数效果相同,除了您只是在函数外部进行数学运算并保持函数简单和通用。

我说你可以用这种方式完成同样的事情,但功能简单易读,非常通用。