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
就可以了。