#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无关。
答案 0 :(得分:4)
在您的代码中,首先,您需要在取消引用之前将内存分配给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)
为标准投诉。
答案 1 :(得分:2)
你做不到:
Elem *p;
[...]
double pi = 3.14;
[...]
p->d = π
...因为p
没有任何意义。最好的程序行为将是未定义的,但最多会崩溃。正确的代码可以做我认为你想要实现的目标:
#include <stdio.h>
#include <stdlib.h>
typedef struct elem {
void * d;
} Elem;
int main(void) {
double pi = 3.14;
// make p point to allocated memory
Elem *p = malloc(sizeof(*p));
p->d = π
// notice the %lf and *(double *)
// %f is for floats, %lf is four doubles
// and *(double *) means 'use the value of the pointer (the d field)
// as the pointer to double type. And then use the value it points to
printf("%lf\n", *(double *)(p->d));
return 0;
}