2016-12-31 19 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'の第2引数は、文字( 'char')ではなく文字列(' 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などのパラメータの使用は、以下を使用するのと同じです。これをchar* modeに渡し、0x72を読み取るメモリアドレス(ポインタ)に変換してでmode文字列の文字を取得します。 0x72のメモリ位置へのアクセスは、おそらくその場所がアプリケーションで利用できないため失敗します。

リテラルchar*について、あなたは

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

Cでは、'r'"r"の間に違いがあります。あなたのC本をチェックしてください。

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

'r'したがって種類charであると仮定され、0x72(ASCII)の値を有する:

+0

Minusoners、どこが間違っていますか? –

+0

downvoterではなく、答えはどこに問題があるのか​​、それがなぜ問題なのか、解決策は何かを特定する必要があります。 –

+0

@ machine_1コンパイラがメッセージ内のポイントを指していませんでしたか? –

3

'r'のように"r"を使用する必要が関数に渡されたときに、int型を持つ、単一の文字です。

ファンクションfopen()は、2番目の引数がcharへのポインタ(const)(つまり、const char *)であると想定しています。したがって、警告メッセージ。 intからポインタへの変換は、さまざまな理由からCで許可されていますが、コンパイラはそのような変換を疑わしいものとして扱い、警告します。

この関数は、渡されたポインタが文字列であることを期待しています。つまり、値がcharの配列の最初の文字を指していることを前提としています。それは(あなたがintを渡したので)表示されないので、未定義の動作を示します。定義されていない動作の1つの症状は、セグメンテーション違反です(プログラムがメモリにアクセスしていないことをオペレーティングシステムが検出し、プログラムにSIGSEGV信号を送信したことが原因です)。

'r'の代わりに"r"を渡して問題を解決してください。一重引用符ではなく二重引用符に注意してください。 "r"は、文字列リテラルで、'r''\0'の2つの文字を使用して表されます。これは、fopen()になります。これを行うと、プログラムの実行中に警告とエラーの両方がなくなります。

プログラムを実行する前に、コンパイラから警告メッセージを確認する習慣を身につけてください。警告はしばしば潜在的な問題を示します。この場合、警告の原因はプログラムの異常終了の原因にもなります。

関連する問題