2

私はCで次のコードを持っています:

while(tempNode!=NULL) {
    int pos = pathNodesCount-1-i;
    pathNodes[pos] = tempNode;
    //printf("A");
    euclidianLength += tempNode->g;
    i = i+1;
    tempNode = tempNode->parent;
}

printf("A")ステートメントをコメントアウトしたままにして、コードをコンパイルして実行すると、「アプリケーションの実行が停止しました」という Windows エラーが発生します。行のコメントを外しprintf("A")、再コンパイルして実行すると、アプリケーションは最後まで実行されます (途中でコンソールに "A" が出力されます)。なんで?

環境は次のとおりです。

  • ウィンドウズ7 32ビット
  • MinGW32 20120426 (および MSys 1.0 を追加しました)
  • C/CPP 用の Eclipse Juno

==更新

エラーを追跡しました。長すぎるので正確なコードは掲載しませんが、char 配列を作成し、間違ったインデックスに文字を追加するケースでした。このようなもの:

int otherCrap() {
    char* c = malloc(10*sizeof(char));
    int i = 0;
    for(i = 0; i<13; i++) {
        c[i]='a';
    }
    c[15] = '\0';
    printf("A");
    printf(c);

    return 0;
}

文字が既存のインデックスでのみ配列内に配置されるように修正し、配列の最後の要素として「\ 0」文字を追加すると、問題が修正されました。ただし、コードが悪いときに、char 配列を出力する前に printf('A') を追加しても実行時エラーが発生しなかった理由については、まだ明確ではありません。これまでの回答から、これは「未定義の動作」に該当することを理解しています。

4

1 に答える 1

4

おそらく、コードのエラーが原因で未定義の動作が発生するためです。コードが存在する場合に「機能する」ように見せることprintf()は問題ありません。

逆方向に数えるそのインデックスロジックは恐ろしいように見えます。正しいことを確認してください。使用する前にインデックスを印刷し、pathNodes配列の既知のサイズ(ある場合)と比較します。インデックスが負になるか、の容量を超過することに注意してくださいpathNodes

于 2012-10-19T11:33:56.443 に答える