C语言 结构指标的格式规范

20jt8wwn  于 2022-12-02  发布在  其他
关注(0)|答案(3)|浏览(127)
#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|警告:格式“%u”需要类型为“unsigned int”的参数,但参数2的类型为“struct Graph *”[-Wformat=]|
对于struct Graph *类型,我应该使用什么格式说明符?

gwbalxhn

gwbalxhn1#

C标准只为预定义类型指定格式说明符。扩展的MACRO用于打印固定宽度的整数,但不存在 whole 用户定义/聚合类型的格式说明符。
你没有一个数组、结构等的格式说明符。你必须把单个元素/成员根据它们的类型打印出来。你需要了解你要打印的数据(类型)是什么,并使用合适的格式说明符。
在本例中,您可以打印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.

mhd8tkvw

mhd8tkvw2#

编译器是对的,graph有另一个不同于unsigned int的类型,它将由%u打印。您可能需要graph->V,因为struct没有其他数字成员。

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

另请注意,当您尝试打印unsigned int时,您的V具有int类型。
更新
对于struct Graph *类型,我应该使用什么格式说明符?
如果是指标,您需要格式规范%p,以及转换成它所接受的型别。

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

请参阅online demo

rjee0c15

rjee0c153#

看看你会做什么,我的朋友。似乎你想打印出你已经分配给int v的值。
您会得到该错误,因为变量v具有返回类型int,您尚未将其包含在您的printf中...因此
printf("%u", graph -> v);

相关问题