【发布时间】:2017-09-05 23:52:31
【问题描述】:
我正在测试将 void 指针转换为同一变量中的不同类型时遇到的问题。问题似乎出在尝试对强制转换的指针使用相同的变量时。下面我有一段代码对此进行测试。有人能告诉我为什么程序无法针对这种情况进行编译吗?
#include <stdlib.h>
typedef struct test {
int a;
}test;
int main() {
void * check;
test * check2;
check = malloc(sizeof(test));
check = ((test *) check);
check2 = (test *)check;
check->a = 2; //this raises an error (dereferencing void pointer) when compiling
check2->a = 2; //this works
((test *)check)->a = 2; //this also works
}
【问题讨论】:
-
您不能取消引用(即应用运算符
*或运算符->到)空指针。 -
你认为
check = ((test *) check);改变了check的type吗? -
@MooingDuck 为什么不改变支票的类型?
-
因为对象的类型是由它的声明决定的,而不是由以后可能分配给它的任何值决定的。这:
check = ((test *) check);将check的值从void*显式转换为test*,然后通过赋值隐式地将结果转换回void*。同样,int n; n = 2.5;不会导致n能够保存小数值;它仍然是int。 -
check = ((test *) check);什么都不做。你的编译器可能会优化它