警告:格式'%d'需要类型为'int'的参数,但参数3的类型为'int *'

时间:2013-08-30 21:31:47

标签: 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 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);
 }

4 个答案:

答案 0 :(得分:2)

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

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

为:

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

后来:

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

为:

    fprintf(arq,"%d ",img->matrizPixels[i][j]);

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

顺便说一句,看起来你的for循环表达式的顺序错误。这有点奇怪:

for(i = 0; i++; i < img->l )

我希望你的意思是:

for(i = 0; i < img->l; i++)

答案 1 :(得分:0)

删除&,因为%d使用了int

这样的事情: -

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

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

答案 2 :(得分:0)

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

您需要将&放在变量前面。 &x会生成指向x的指针,您只需要x

答案 3 :(得分:0)

img是指向PGM结构的指针。语句img->c取消引用指针并解决PGM中的c变量。你也可以编写代码:(*img).c parens是必要的,因为解除引用运算符*的优先级非常低,你希望它绑定到img,以便* img是一个解引用的结构。

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

因此,请写img->c(其他答案)或(*img).c