2016-12-31 71 views
0

我要检查这个功能文件是否存在:警告:传递的来自整数“的fopen”使指针参数2没有投

#include <stdio.h> 

int main(int argc, char **argv) { 
    int textFileExists(const char *filename){ 
     FILE *fp= fopen(filename,'r'); 
     if(fp==NULL){ 
      printf("%s %s.\n","There was an error opening ", filename); 
      return -1; 
     } 
     return 1; 
    } 

    textFileExists("text.txt"); 
    return 0; 
} 

但是,当我编译这段代码,我得到这样的警告。

warning: passing argument 2 of ‘fopen’ makes pointer from integer without a cast 
    FILE *fp= fopen(filename,'r'); 

运行此代码给了我一个分段错误。

这是怎么回事?

+8

''r'' ===>' “R”'' – WhozCraig

+5

fopen'应为字符串('字符*'),而不是一个字符('char')的第二个参数。将''r''改为'“r”'。 “r”是一个字符,而“r”是一个字符串。 –

+0

参见:[单引号与C或C++中的双引号](http://stackoverflow.com/questions/3683602/single-quotes-vs-double-quotes-in-c-or-c)。 –

回答

4

字面'r'作为fopen参数的使用相当于使用下面的:因此

const char* filename = ...; 
char mode = 'r'; 
fopen(filename, mode); 

'r'被假定为char类型的,并且具有的0x72(ASCII)的值。然后传递给char* mode,将0x72转换为要读取的存储器地址(指针),以获得mode字符串的字符fopen。访问0x72处的内存位置失败,因为该位置很可能不适用于您的应用程序。

对于char*文字,你需要在

const char* filename = ...; 
const char* mode = "r"; 
fopen(filename, mode); 
-1

在C中,'r'"r"之间有区别。检查你的C书。

+0

无人问题,我错在哪里? –

+0

不是downvoter,但答案应该指出问题在哪里,为什么是问题,以及解决方案是什么。 –

+0

@ machine_1没有编译器指向那个消息吗? –

3

'r'使用"r"为是单个字符其中,传递给函数时,具有类型int

函数fopen()期望第二个参数是指向char的(const)指针(即const char *)。因此警告消息。由于各种原因,在C中允许从int到指针的转换,但编译器通常会将此类转换视为可疑,并发出警告。

该函数期望传递的指针是一个字符串,这意味着它假定值指向char数组的第一个字符。它没有(因为你通过了int),所以展品未定义的行为。未定义行为的一个症状是分段违规(由您的操作系统检测到您的程序访问它不应该存储的内存以及向您的程序发送一个SIGSEGV信号引起)。

要解决问题,通过"r"而不是'r'。请注意双引号而不是单引号。 "r"是一个字符串文字,用两个字符'r''\0'表示,这是fopen()的期望值。这样做会消除运行程序时的警告和错误。

获取检查从您的编译器警告消息之前自办节目的习惯。警告通常表示潜在的问题 - 在这种情况下,警告的原因也是异常程序退出的原因。

相关问题