gpt4 book ai didi

c - 在 memcpy 期间取消引用 void * 指针,想知道如何解决这个问题?

转载 作者:太空狗 更新时间:2023-10-29 16:05:42 24 4
gpt4 key购买 nike

我正在从 buf 索引 5 复制 src。我在 src 缓冲区收到警告。只想知道我在这里犯了什么错误?

这是我收到的警告信息。 警告:取消引用“void *”指针

uint8_t grx_buf[1024];
const void *buf;
uint8_t len = 12;

memcpy(&grx_buf[grx_count], &buf[5], len);
^

当我将其转换为目标缓冲区数据类型时,我得到了这个

memcpy(&grx_buf[grx_count], *(uint8_t*)&buf[5], len);

警告:

note: expected ‘const void * restrict’ but argument is of type ‘unsigned char’

extern void *memcpy (void *__restrict __dest, const void *__restrict __src,

最佳答案

你几乎是正确的!

memcpy(&grx_buf[grx_count], *(uint8_t*)&buf[5], len);

除此之外,您应该将指针变量传递给 memcpy 的 srcdst 参数。在此语句中,在第二个参数(src 参数)中,您正在执行以下操作:

  • 解引用 void* 以获取第 5 个元素。这与您第一次遇到的错误相同。

  • 获取其地址。

  • 转换为 uint8_t*(您真正想要的)

  • 再次解除引用,因此您有一个 uint8_t,而不是一个指针,这正是 memcpy 函数所期望的。

你真正想要的是:

memcpy(&grx_buf[grx_count], (uint8_t*)buf+5, len);

或者,尝试遵循您的语法:

memcpy(&grx_buf[grx_count], &((uint8_t*)buf)[5], len);
  • 将 buf 转换为 uint8_t*

  • 取一个完整类型的第 5 个元素,所以你得到一个 uint8_t

  • 获取它的地址,这样您就有了一个指向 uint8_t 的指针,这正是 memcpy 所期望的。


编辑:请注意,您的缓冲区的类型为 const void*,因此所有指针转换都应为类型 const uint8_t * 而不是 uint8_t* ,以保持constness的一致性。

或者,更简单(更简洁)的方法是创建一个新变量:

const uint8_t *buf8=buf; //No cast required, since in C (not C++) `void*` can be implicitly converted to any type.

现在您应该按如下方式使用 buf8:

memcpy(&grx_buf[grx_count], buf8+5, len);

关于c - 在 memcpy 期间取消引用 void * 指针,想知道如何解决这个问题?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44586137/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com