在C中,我有:
char *p, *q;
p = malloc(1); //for the purpose testing only
p[0] = '!';
q = *((char **)p);
printf("p=%x q=%x\n", p, q);
printf("p=%c q=%c\n", p, q);
没有投射警告,输出为:
p=1a9008 q=21
p q=!
分配给q
的表达式会发生什么,即*((char **)p)
?作业后q
的类型是否发生了变化?
编辑:我的代码中有错误。在尝试从代码片段中提取它时,我遇到了一个完全可用的示例,我错误地使用了char类型的示例值。在检查了更多原始代码之后,为p分配了一个指针值。所以p是指向指针的指针。
答案 0 :(得分:2)
首先,变量的类型无法更改,如果它被声明为char* q
,则其类型为char*
。
什么可以改变它的变量值,但在你的情况下,代码是完全错误的。
首先p
被声明为指向char
的指针,并且通过malloc分配单个字节,因此您将拥有类似
p = 0xDEADBEEF
|
---> '!'
然后通过强制转换你强制p
被认为是char**
,所以指向一个指向char的指针,会发生什么是编译器被迫考虑
p = 0xDEADBEEF
|
-----> 0x??????21
|
--------> char
所以基本上你是强制手动分配和分配的内存被解释为内存地址,然后你将这个指针取消引用指针,这样*(char**)
就会产生一个char*
0x??????21
所以没有任何意义。