我目前正在学习如何用C语言编程.今天我开始使用指针,我遇到了以下情况.当我编译程序时
#includeint main() { int a; double * p; p = &a; *p = 12.34; printf("%d\n",a); * (int *) p = 12.34; printf("%d\n",a); return 0; }
它说
$ gcc zeigertypen.c zeigertypen.c: In function ‘main’: zeigertypen.c:7:7: warning: assignment from incompatible pointer type [-Wincompatible-pointer-types]
并在执行时,我得到输出
2061584302 Speicherzugriffsfehler (Speicherabzug geschrieben)
错误消息是德语之类的
memory access error (core dumped)
但是,如果我注释掉该行,*p = 12.34;
则错误消失并且输出为
0 12
代码的目的是演示与它们引用的变量不同类型的指针的问题.根据我用来学习C++的教科书,输出应该是
2061584302 12
Bathsheba.. 5
行为p = &a;
实际上是未定义的.
C和C++都不允许您将&a
(指向int
)的类型重新解释为指向a的指针double
.
(int*)p
同样存在问题,尽管那时已经造成了损害.
您可以从以下位置强制转换void*
为原始类型void*
:现在,将这些视为唯一可以将指针类型强制转换为其他类型的情况.
行为p = &a;
实际上是未定义的.
C和C++都不允许您将&a
(指向int
)的类型重新解释为指向a的指针double
.
(int*)p
同样存在问题,尽管那时已经造成了损害.
您可以从以下位置强制转换void*
为原始类型void*
:现在,将这些视为唯一可以将指针类型强制转换为其他类型的情况.