Ton*_*ony 5 c memory pointers void-pointers dereference
我目前正在使用Linux内核模块,我需要访问存储在数组中的一些64位值,但是我首先需要从void指针进行转换.
我正在使用phys_to_virt返回void指针的内核函数,我不完全确定如何实际使用此void指针来访问它指向的数组中的元素.
目前我这样做:
void *ptr;
uint64_t test;
ptr = phys_to_virt(physAddr);
test = *(uint64_t*)ptr;
printk("Test: %llx\n", test);
Run Code Online (Sandbox Code Playgroud)
我从测试中获得的值不是我期望在数组中看到的值,所以我很确定我做错了什么.我需要访问数组中的前三个元素,所以我需要将void指针强制转换为uint64_t [],但我不太清楚如何做到这一点.
任何建议将不胜感激.
谢谢
我正在使用内核函数 phys_to_virt,它返回一个 void 指针,并且我不完全确定如何实际使用这个 void 指针来访问它指向的数组中的元素。
是的,phys_to_virt()确实返回一个void *. 的概念void *是它是无类型的,因此您可以向其中存储任何内容,是的,您需要将其类型转换为某些内容以从中提取信息。
ptr = phys_to_virt(physAddr); // void * returned and saved to a void *, that's fine
test = *(uint64_t*)ptr; // so: (uint64_t*)ptr is a typecast saying "ptr is now a
// uint64_t pointer", no issues there
// adding the "*" to the front deferences the pointer, and
// deferencing a pointer (decayed from an array) gives you the
// first element of it.
Run Code Online (Sandbox Code Playgroud)
所以是的,test = *(uint64_t*)ptr;将正确类型转换并为您提供数组的第一个元素。注意你也可以这样写:
test = ((uint64_t *)ptr)[0];
Run Code Online (Sandbox Code Playgroud)
您可能会发现更清楚一点,并且含义相同。