C - 传递'fprintf'的参数1使得整数指针没有强制转换

时间:2016-01-20 11:58:58

标签: c printf

非常简单的脚本抛出此错误:

  

传递'fprintf'的参数1使得指针来自整数而没有   投

为什么?代码是:

#include <stdio.h>
#include <string.h>

int main(int argc, char *argv[])
{
FILE *FP;

if((FP = fopen("file.txt", "r+")) == NULL) {
    printf("File won't open\n");
    return(1);
}

foo(FP);

return(0);
}

int foo(FP) {

    char name[31];
    printf( "Please enter a name (within 30 char) : \n");
    gets(name);
    fprintf(FP, "%s\n", name);

    return(0);
}

4 个答案:

答案 0 :(得分:2)

更改

int foo(FP) {

int foo(FILE * FP) { 

您必须在代码顶部放置foo函数的原型。

答案 1 :(得分:1)

foo(FP)声明中的参数FP没有使其默认为int的类型。由于foo将其用作对fprintf的调用中的第一个参数,因此int将转换为FILE指针,该指针是合法的但已弃用。

修复:只需将foo声明为int foo(FILE *FP){...}

编辑:是的,正如LP所说,你应该在使用之前声明该函数,特别是如果你传递或返回除int之外的其他类型的函数。声明可以与定义分开,也可以在标题中;或者您只需将函数定义(也是声明)移动到首次使用之前的位置。

答案 2 :(得分:1)

默认情况下,C中的函数arg的类型为int。因此,当您定义函数时,签名实际上是

int foo(int FP).

您应该将其更改为

int foo(FILE *FP)

当然,在调用函数之前声明函数会很好。

答案 3 :(得分:0)

您忘记了Foo函数中FP参数中的类型分类器。令人惊讶的是,你没有得到关于它的警告。 在您编译时,请打开-Wall-pedantic标记(如果您在gcc上)。或至少-Wimplicit-int警告标志,以避免类似的问题