1

オンライン サイトから提供されたコードのいくつかをいじっていたときに、予想もしていなかった奇妙な不具合に遭遇しました。変数が、手動で割り当てを行わなくても突然値が変更されたのです。

以下のコードは次のとおりです。

int rc = fwrite(conn->db, sizeof(struct Database), 1, conn->file);
printf("rc is equal to %d\n", rc); // should print out 1
if (rc != 1) die("Failed to write Database.");

rc = fflush(conn->file);
printf("rc is equal to %d\n", rc); // should print out 0
if (rc == -1); die("Cannot flush database"); // error handling
// error comes up because rc suddenly changes to -1

それがどのように起こるかはわかりませんが、C で変数が予期しないときに突然変更される理由を知りたいです。

コード ソース: http://c.learncodethehardway.org/book/learn-c-the-hard-waych18.html (Database_write の下のヒープ スタックとメモリ)

ちなみにMac osx 10.6 Snow LeopardのTerminalでvimを使っています。

4

5 に答える 5

8

-1 にはなりません。まだゼロです。コードにセミコロン (;) があってはならない場所にあります。代わりに次のものが必要です。

if (rc == -1) die("Cannot flush database");
于 2012-08-29T22:31:00.683 に答える
2

の値はrc変わりませんが、ifステートメントに問題があります。

if (rc == -1); die("Cannot flush database");
             ^

2 番目のifステートメントには、アクションが関連付けられていません。;が削除されない限り、die()の値に関係なく、 は常に実行されますrc。つまり、代わりにこれを使用します。

if (rc == -1) die("Cannot flush database");
             ^
于 2012-08-29T22:31:28.023 に答える
1

小さなエラーがあります

 if (rc == -1);
              ^
              ^

die ステートメントが常に実行されるようにします。条件の値はチェックされ、使用されることはありません

于 2012-08-29T22:32:42.523 に答える
1

バグは次のとおりです。

if (rc == -1); die("Cannot flush database"); // error handling

;後付けの為、ごif対応dieの対象外となりますif。この種のバグは、構造化コードを作成していない場合に発生する可能性が高く、頻繁に発生します。これは次のようになります。

if (rc == -1)
{
    die("Cannot flush database"); // error handling
}

;その中にアフターがあればif、すぐにわかります。

于 2012-08-29T22:47:24.307 に答える
0

述べたように、セミコロンが問題です。

ここで行ったことは、望んでいることではありませんが、完全に合法です。これは null ステートメントと呼ばれます。これはセミコロンのみで書かれています。if ステートメントが true の場合、実際には先に進み、ステートメントを実行しています。つまり、null ステートメントです。

于 2012-08-29T23:01:27.087 に答える