非常简单的脚本抛出此错误:
传递'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);
}
答案 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
警告标志,以避免类似的问题