-3

このコードは、実行時に「バス エラー: 10」を返します。

int main(int argc, char *argv[]) {
    int row, column, tick;
    char *prompt;
    char c;

    ...
    return 0;
    }

ただし、宣言をコメントアウトするchar c;と、プログラムは正常に実行されます。

int main(int argc, char *argv[]) {
    int row, column, tick;
    char *prompt;
    //char c; 

    ...
    return 0;
    }

何が起こっているのか本当にわかりません。char c;単なる宣言ですよね?ここでは何も初期化していません。

4

2 に答える 2

4

プログラムのバグのある部分を除外しています。宣言を移動した場合にプログラムが機能しているように見えるのは、機能するようにスタックを再配置しているためです。

于 2012-12-10T05:48:02.147 に答える
1

どのCPUで実行していますか?

バスエラーは、少なくともアラインされていないメモリアクセスを意味する可能性があります。これは、初期化されていない、または破損したポインタを介してメモリにアクセスした結果であることがよくあります。

charを削除するときにプログラムがクラッシュしない、またはクラッシュしないのは、コードを変更した場合のランダムな副作用である可能性があります。それがその文字だけであるという意味ではありません。どんな変更でもそれを作ったり壊したりする可能性があります。

あなたが持っている

char *prompt;

これは少し疑わしいです。ポインタをそのように初期化しないままにしておくのは賢明ではありません。まず、ポインタ(およびコード内の同様の場所)を次のように変更します。

char *prompt = 0; // NULL

したがって、実際の初期化の前に使用すると、メモリの破損ではなくセグメンテーション違反が発生します。

于 2012-12-10T13:43:23.273 に答える