#include <stdio.h>
typedef struct elem{
void * d;
}Elem;
main(){
Elem *p;
Elem e;
double pi = 3.14;
e.d = π
p->d = π
printf("%f\n",p->d);
printf("%f\n",e.d);
}
main.c:25: 警告:格式“%f”需要类型“double”,但参数 2 的类型为“void *”
main.c:26: 警告:格式“%f”需要类型“double”,但参数 2 的类型为“void *”
我在尝试正确打印这些值时遇到了问题。我得到的值与 3.14 无关。
在您的代码中,首先,您需要在取消引用之前为 p
分配内存。否则,它调用 undefined behavior .否则,p
是一个未初始化的指针并指向一个内存,您的程序可能无法访问该内存,因此本质上是一个无效的内存位置。任何取消引用该指针的尝试都将调用 UB。
在那之后,
printf("%f\n",p->d);
printf("%f\n",e.d);
调用 undefined behavior ,因为您实际上是在尝试使用 %f
格式说明符打印地址。
你要做的就是
将 void
指针转换为 float
指针(因为,您不能取消引用 void *
)
<
然后,去引用指针以获取值。
喜欢
printf("%f\n",*((float *)(p->d)));
printf("%f\n",*((float *)e.d));
也就是说,main()
应该是 int main(void)
,至少,是标准投诉。
我是一名优秀的程序员,十分优秀!