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

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

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,所以我实际上无法修改它。

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

#1楼 票数:2 已采纳

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

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

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

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

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

#2楼 票数: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);

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

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

  ask by Tigger12 translate from so

未解决问题?本站智能推荐:

3回复

C中的指针和内存混乱

如果我有以下代码行: 这是否意味着它是指向3个整数数组中的第一项的指针(因此,它的大小为4个字节)? 还是这意味着它是一个由3个指针组成的数组(大小为12个字节)?
6回复

C中的内存寻址和指针

这取自C,并基于此。 假设我们有一个32位指针 它指向内存中包含某些数据的某个位置。 它知道此指针的增量以1字节为单位,以此类推。另一方面, 也指向内存中的某个位置,如果我们增加它,它知道如果我们加1,它应该增加4个字节。 问题是,如果这些指针显然包含一些信息,可以使它
2回复

C中的指针和内存算法

采取以下程序: 第一个内存地址在:0x7fff9cb3a1e0,后面的地址是:0x7fff9cb3a1e4 与指针运算的区别是: 1 与内存地址的实际差异为:4 这是正确的做法吗: ptr 算法: ptrdiff_t b = (a+1) - a; 内存地址之间的实际算术: (
2回复

C中的指针和内存问题

我有一个C程序,输出两个不同的字符串并将它们连接起来。 第二个输出s和t是相同的东西,但是第三个输出是不同的。 为什么是这样? 我认为这与将它们声明为指针的方式有关,但我不确定。
3回复

C中的指针和内存分配

程序: 问题:有什么区别: 从我的理解* z指向x和* y的地址指向x,但是* y指向x不需要x的地址? 我真的不明白这两个变量是怎么回事。 编辑:我也想知道何时知道何时在堆栈上或堆上分配变量? 为什么在堆栈上分配x,y和z? 为什么* y,** y,*
5回复

C中的内存分配和指针

我正在为考试而学习,遇到了难以理解的问题。 我们正在使用指针和内存分配,而我只是在鬼混,试图看看什么改变了什么。 我有这段代码: 但是我发现的是,如果我不使用* arr [index] = i,而是使用arr [index] =&i,则不需要malloc 。 我一直认为这两件事本质
2回复

在C中使用指针时防止内存覆盖

我是C语言的新手,我现在开始编写一个简单的程序,该程序在启动后运行, 没有操作系统 ,因此我没有malloc等。 我正在尝试了解内存管理; 看这个例子: 我怎么知道b不会覆盖a呢? 尤其是在编写仅在运行时知道字符串长度的函数时?
3回复

在C中使用指针覆盖内存的可能性?

我在K&R c书之后写了自己的getline函数 它用于初始化字符串 只是想知道,如果存储位置str1和str1指向的位置非常接近,那么getline(str2)覆盖字符串1中的内容怎么办? 有可能我怎么避免呢? 谢谢! 更新: 是的,程序停止执行上述代码片段