指向结构的指针的格式说明符

时间:2017-09-05 05:55:07

标签: c printf format-specifiers

#include<stdio.h>
#include<stdlib.h>

struct Graph
{
     int v;
};

int main()
{
    struct Graph* graph = (struct Graph*) malloc(sizeof(struct Graph));
    graph -> v = 1;
    printf("%u", graph);
    return 0;
}

但我收到关于格式的警告:

printf("%u", graph);

警告是:

  

/home/praveen/Dropbox/algo/c_codes/r_2e/main.c|14|warning:格式'%u'需要'unsigned int'类型的参数,但参数2的类型为'struct Graph *'[ - Wformat =] |

我应该为类型struct Graph *使用什么格式说明符?

2 个答案:

答案 0 :(得分:4)

C标准仅指定预定义类型的格式说明符。扩展的MACRO用于打印固定宽度的整数,但整个用户定义/聚合类型没有格式说明符。

您没有数组,结构等的格式说明符。您必须采用单个元素/成员并根据其类型进行打印。您需要了解要打印的数据(类型),并使用适当的格式说明符。

在您的情况下,您可以打印V类型的成员int。所以你可以做类似

的事情
 printf("%d", graph->V);

或者,如果你想打印由malloc()返回并存储到graph的指针,你可以这样做

  printf("%p", (void *)graph);

最后,see this discussion on why not to cast the return value of malloc() and family in C.

答案 1 :(得分:1)

编译器是正确的,graph具有unsigned int以外的其他类型,%u将打印该类型。您可能需要graph->V,因为struct没有其他数字成员。

printf("%u", graph->V);

在您尝试打印V时,请注意intunsigned int类型。

更新

  

我应该为类型struct Graph *使用什么格式说明符?

对于指针,您需要格式说明符%p并将其转换为它接受的类型。

printf("%p", (void*)graph);

请参阅online demo