私はすべてのコードを書いたUbuntuで問題なく走った大学のプロジェクトのCコードを書きました。それがマークされたとき、教師はそれが何の生産ももたらさないと言った。しかし、それでも私にはうまくいきますが、教師がWindows上で自分のコードを実行した疑いが正しいことが証明されました。私は問題を捜した。それは以下の通りであった:WindowsとUbuntuで扱われるC配列が異なります
Iは、char配列を有する:
char grade[2];
をそれがそれにコピー別のチャーインスタンスの含有配列(char grade_str[3]
)、、、 "B3" の内容を有している(私は
strcpy(grade, grade_str);
)、これは間違いである認識しています文字列grade
は(「B3」におそらく今等しい)strcmp
を使用して一致を()を取得するために、グレードの完全なファイルに比較です。 grade
これは、 "B30〜$)"のようなものです。いくつか余分なランダムな文字が付いているので、Windows(正確には7つ)を除いて、一致することはありません。配列は2バイトしかないので、これは許されません。私は問題がほぼ確実に文字列とnullバイトの両方のための十分なスペースを提供していないため、char grade[3];
を使用して実際に状況を修正していることを知っています。 しかし、WindowsまたはUbuntuでコンパイルするときにエラーが発生しない理由と、さらにそれがUbuntuで毎回完璧に実行される理由を知りたいですが、Windowsでは決して実行しません。私は今からWindowsとLinux上で自分のコードをチェックしなければならないように感じる...、またはこれらのエラーがコンパイラによって適切に引き上げられていることを確認する手段があるのだろうか?スーパー警戒モード?使用
コンパイラ:
- のUbuntu:gccのバージョン5.2.1 20151010(Ubuntuの5.2.1-22ubuntu2)
- のWindows 7:ちょうどそれはですのでかなり確信して、それを更新MINGW32 GCC 4.7
コンパイル時にCなどの言語ですべてのメモリアクセスエラーをキャッチすることは不可能です。 – wRAR
ありがとう、ありがとう。私はそれが可能だと思っていただろう...私は今この質問を削除するので、他の誰かが同じ質問を持っている場合、彼らは再び全面的に尋ねなければならないでしょう。 – Totem
初期化は表示されていません。 'char grade [2];は単なる宣言または暫定的な定義です。 'char [2]'は2つの 'char'sの配列ですが、3つの' chars'をそれに移動しようとします! – Olaf