2

私は自分が参加しているコースのプログラミングプロジェクトに取り組んでおり、Cプログラミングの根本的な誤解に過ぎないと思うことに苦労しており、SOが役立つことを望んでいました. このコードでファイルを開こうとしています:

FILE *fp;
if(fp = fopen("testfile.txt", "r") == NULL){
    perror("fileopen");
}

そのコードをコンパイルしようとすると、次の警告が表示されます: 警告: 割り当てにより、キャストなしで整数からポインターが作成されます

次に、ファイルを読み込もうとすると、セグメンテーション違反が発生します。

私は経験豊富な Java プログラマーですが、C のポインターとデータ型について理解できないことがあります。

ありがとう!

4

3 に答える 3

2

他の人が指摘しているように、if. それを避けるために、物事を分割します。より読みやすく、エラーが発生しにくくなります。

FILE *fp;
fp = fopen("testfile.txt", "r");
if(fp  == NULL) {
    perror("fileopen");
}

または、あなたがよく目にするもの:

FILE *fp;
fp = fopen("testfile.txt", "r");
if(!fp) {
    perror("fileopen");
}
于 2013-09-25T14:08:51.977 に答える
1

問題は、演算子の優先順位の誤解です。が最初に評価され、からの実際の戻り値ではなくfopen("testfile.txt", "r") == NULL、結果 (1 または 0) がポインターに格納されます。fpfopen("testfile.txt", "r")

実際に (fp = fopen("testfile.txt", "r")) == NULLは、if ステートメントで使用する必要があります。または、始めたばかりの場合は、これを少し分解して次のように書く方がよいかもしれません。

FILE *fp = fopen("testfile.txt", "r");
if(fp == NULL){
    perror("fileopen");
}
于 2013-09-25T14:06:31.877 に答える
1

括弧のペアがありません:

(fp = fopen("testfile.txt", "r") == NULL)

として解析されます

(fp = (fopen("testfile.txt", "r") == NULL))

これは比較を評価し、 を与えますint。これはポインター値の変数に格納されるため、警告が表示されます。

そのはず

((fp = fopen("testfile.txt", "r")) == NULL)
于 2013-09-25T14:06:53.990 に答える