C 警告:格式‘;%d’;应为类型为‘;int’;,但参数3的类型为‘;int*’;

C 警告:格式‘;%d’;应为类型为‘;int’;,但参数3的类型为‘;int*’;,c,warnings,C,Warnings,当我编译代码时,它会显示3个警告: warning: format ‘%d’ expects argument of type ‘int’, but argument 3 has type ‘int *’ warning: format ‘%d’ expects argument of type ‘int’, but argument 3 has type ‘int *’ warning: format ‘%hhu’ expects argument of type ‘int’, but a

当我编译代码时,它会显示3个警告:

warning: format ‘%d’ expects argument of type ‘int’, but argument 3 has type ‘int *’ 
warning: format ‘%d’ expects argument of type ‘int’, but argument 3 has type ‘int *’
 warning: format ‘%hhu’ expects argument of type ‘int’, but argument 3 has type ‘unsigned char *’ 
代码如下:

typedef struct
{
int c; 
int l; 
unsigned char **matrizPixels; 
} PGM;

 void salvaPGM(PGM *img, char* saida)

 {
int i,j;

FILE *arq;

arq = fopen(saida,"w");

fprintf(arq,"P2\n");
fprintf(arq,"%d ", &img->c);
fprintf(arq,"%d ", &img->l);
fprintf(arq,"255\n");

for(i = 0; i++; i < img->l )
{
    for (j = 0; j++; j < img->c)
    {
        fprintf(arq,"%hhu ",&img->matrizPixels[i][j]);
    }
     fprintf(arq,"\n");
}

   fclose (arq);
 }
typedef结构
{
INTC;
int l;
无符号字符**矩阵像素;
}PGM;
无效salvaPGM(PGM*img,char*saida)
{
int i,j;
文件*arq;
arq=fopen(saida,“w”);
fprintf(arq,“P2\n”);
fprintf(arq、%d、&img->c);
fprintf(arq、%d、&img->l);
fprintf(arq,“255\n”);
对于(i=0;i++;il)
{
对于(j=0;j++;jc)
{
fprintf(arq、%hhu、&img->matrizPixels[i][j]);
}
fprintf(arq,“\n”);
}
fclose(arq);
}

在使用
%d
时,删除
&

大概是这样的:-

fprintf(arq,"%d ", img->c);
fprintf(arq,"%d ", img->l);


printf
格式字符串指定了一个
int
,但您提供了一个
int*
,一个指向
int
的指针


您需要将
放在变量前面
&x
导致指向
x
的指针,您只需要
x

您有几个
printf
语句,它们的格式字符串和参数不匹配。这些不匹配将导致程序具有未定义的行为,因此编译器会警告您。您需要更改:

fprintf(arq,"%d ", &img->c);
fprintf(arq,"%d ", &img->l);
致:

后来:

    fprintf(arq,"%hhu ",&img->matrizPixels[i][j]);
致:

我删除了上一个中的
hh
,因为它是不必要的。我还将
%u
更改为
%d
,以匹配将发生的默认参数提升

另一方面,您的
for
循环表达式的顺序似乎不正确。有点奇怪:

for(i = 0; i++; i < img->l )
(i=0;i++;il)
我想你的意思是:

for(i = 0; i < img->l; i++)
(i=0;il;i++)的
img
是指向PGM结构的指针。语句
img->c
取消对指针的引用,并在PGM中寻址c变量。您还可以编写代码:
(*img).c
由于解引用运算符
*
的优先级非常低,您希望将其绑定到
img
,以便*img是一个解引用结构,因此必须使用paren

&是地址运算符,它创建指针。语句
&img->c
生成指向
c
的指针,但printf希望
c
不是指向它的指针


因此,写
img->c
(根据其他答案)或
(*img)。c

它的意思就是它所说的。它需要一个
int
,但您正在传递一个
int*
。除非您试图打印地址,否则在
printf()
的参数前面不需要
&
。我想这是对今天没有再次阅读编译器消息日的奖励!
    fprintf(arq,"%d ",img->matrizPixels[i][j]);
for(i = 0; i++; i < img->l )
for(i = 0; i < img->l; i++)