内核开发中:将uint32_t类型目标内存地址传入memcpy触发警告
解决memcpy指针类型不匹配的警告问题
这个警告的核心原因很明确:memcpy的第一个参数要求是void*类型的指针,但你代码里的dest是uint32_t类型的整数(虽然它存储的是内存地址),直接把整数传递给需要指针的参数,编译器会认为你是不小心把整数当指针用,所以抛出了"从整数生成指针未做类型转换"的警告。
下面给你两种靠谱的解决方式:
方式一:显式强制类型转换
在调用memcpy时,把dest转换成void*类型,明确告诉编译器你是故意把这个内存地址整数转成指针的:memcpy((void*)dest, bf, 16*sizeof(uint32_t));另外提个小优化:
&bf其实可以直接写成bf,因为数组名本身就是指向数组首元素的指针,两种写法效果完全一致,但bf更简洁。方式二:直接定义指针类型的变量
如果你后续还要用这个目标地址做其他指针操作,不如一开始就把dest定义成指针类型,这样后续代码逻辑更清晰,也不用每次调用都做类型转换:uint32_t bf[16]; uint32_t shmem = (uint32_t)&tos_shared; void* dest = (void*)(shmem - 16*sizeof(uint32_t)); memcpy(dest, bf, 16*sizeof(uint32_t));
最后要提醒一句:内核里的内存地址操作一定要格外谨慎,务必确保dest指向的内存区域是你有权限写入的,且没有越界访问,否则很容易触发内核panic或者其他严重的系统问题。
内容的提问来源于stack exchange,提问作者bluey31
相关产品推荐
相关产品推荐

