在 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
的类型是否发生变化?
编辑:我的代码中有错误。在尝试从代码片段中提取它时,我遇到了一个完整的工作示例,我错误地使用了 p 类型的 char 示例值。在检查了更多原始代码之后,p 被分配了一个指针值。所以 p 是一个指向指针的指针。
最佳答案
首先,变量的类型不能改变,如果它被声明为 char* q
那么它的类型就是 char*
。
什么可以改变变量的值,但在你的情况下,代码是错误的。
第一个 p
被声明为指向 char
的指针,并通过 malloc 分配单个字节,因此您将得到类似的内容
p = 0xDEADBEEF
|
---> '!'
然后通过强制转换,您强制将 p
视为 char**
,因此指向 char 的指针,发生的情况是编译器被强制考虑
p = 0xDEADBEEF
|
-----> 0x??????21
|
--------> char
所以基本上你是强制手动分配和分配的内存被解释为内存地址,然后你取消引用这个指针到指针,以便 *(char**)
产生一个 char *
是 0x??????21
,所以没有意义。
关于c - 了解指针。 *((char **) 等于什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36372433/