【发布时间】:2015-12-10 20:47:41
【问题描述】:
我最近通过测试一些东西试图理解void*,这里是测试代码:
#include <stdio.h>
int main(int argc, char** argv)
{
float nb2 = 2.2;
void* multi_type_ptr = &nb2;
printf("\nmulti_type_ptr:\n");
printf("Elem 1: %f\n",*(float*)multi_type_ptr);
// *(multi_type_ptr + 1) = 4;
// *(int*)(multi_type_ptr + 1) = 4;
*((int*)multi_type_ptr + 1) = 4;
printf("Elem 2: %d\n",*((int*)multi_type_ptr + 1));
return 0;
}
这条指令是否不能工作,因为语言/编译器不知道它应该添加多少字节到multi_type_ptr 的地址(它不知道void* 指向的类型的大小)?
*(multi_type_ptr + 1) = 4;
同样void* 不能被取消引用,所以它应该被转换为正确的类型,对吧?
由于上面提到的问题,这条线仍然无法工作。 p>
*(int*)(multi_type_ptr + 1) = 4;
由于语言/编译器理解它必须将(1 * sizeof int) 添加到地址of multi_type_ptr,因此该分配是否有效? 我使用 Visual Studio 中包含的 cl 编译器。
*((int*)multi_type_ptr + 1) = 4;
看起来(multi_type_ptr + 1) 的结果仍然是(int*),当它的内容被行首的* 访问时,对吗?
提前感谢您以后的更正、解释和强化。
【问题讨论】:
标签: c casting void-pointers