C 意外的编译器警告

C 意外的编译器警告,c,format-specifiers,C,Format Specifiers,如何删除此警告 警告:格式“%d”要求参数类型为“int”,但参数2的类型为“int*”[-Wformat=]printf(“%d”,p1->j) 这是代码,除了警告之外,一切正常 void main() { struct s1 { int *j; }; struct s2 { int k; }; struct s1 *p1; struct s2 *p2; p1=malloc(sizeof

如何删除此警告

警告:格式“%d”要求参数类型为“int”,但参数2的类型为“int*”[-Wformat=]printf(“%d”,p1->j)

这是代码,除了警告之外,一切正常

void main()
{
    struct s1
    {
        int *j;
    };

    struct s2
    {
        int k;
    };
    struct s1 *p1;
    struct s2 *p2;

    p1=malloc(sizeof(struct s1));
    p2=malloc(sizeof(struct s2));
    p2->k=5;
    p1->j=&p2->k;
    printf("%d",p1->j);
}

j
在这里使用时属于
int*
类型:
printf(“%d”,p1->j)
printf
不喜欢这样,需要一个
int
,因此您应该取消引用:

printf("%d",*(p1->j));
以下声明

p1->j=&p2->k; /* check the operator precedence */
应该是

p1->j=&(p2->k); /* j is type of ptr, it should hold address of k variable */
同时访问
printf(“%d”,p1->j)->
printf(“%d”,*(p1->j))p1->j
产生的是地址而不是值。

printf(“%d”,p1->j)->
printf(“%d”,*(p1->j))是学习指针的一些练习的代码吗?因为这些都没有其他意义。你真的应该能够在没有外界帮助的情况下理解这样的警告。仔细阅读那个警告。顺便说一句,
malloc
可能会失败,您应该测试这不是编程问题,OP需要一本C语言书如何测试
malloc
s的结果和
free
-ing分配的结构在使用后…?您能详细说明一下&p2->k和(&p2)->k,我的理解是&p2->k给出了存储k值的实际地址,而as(&p2)->k给出了p2的地址。还是我错了?由于
->
的优先级高于
&
,它首先解决了
p2->k
,这不是我的实际意图。我的意图是获取k@bbcbbc1然后应该是
&(p2->k)
@achal如果你把它倒过来了,
&p2->k
就可以了。