麻烦在结构上打印指向void的指针

时间:2016-01-28 19:58:02

标签: c pointers printing void-pointers

#include <stdio.h>

typedef struct elem{

    void * d;

}Elem;

main(){

    Elem *p;
    Elem e;

    double pi = 3.14;

    e.d = &pi;
    p->d = &pi;

    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无关。

2 个答案:

答案 0 :(得分:4)

在您的代码中,首先,您需要在取消引用之前将内存分配给p。否则,它会调用undefined behavior。否则,p是一个单一化指针并指向一个可能无法从您的程序访问的记忆,从而基本上是一个无效的内存位置。任何取消引用该指针的尝试都会调用UB。

之后,

  printf("%f\n",p->d);
  printf("%f\n",e.d);

调用undefined behavior,因为您实际上是在尝试使用%f格式说明符打印地址。

你需要做的是

  1. void指针强制转换为float指针(因为您无法取消引用void *

  2. 然后,取消指向获取值的指针。

  3.   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 = &pi;

...因为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 = &pi;
    // 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;
}