ポインタ、プロセス、操作、構造、機能、メモリ、あなたはいくつか作ることができるかどうか確認を含む12 C言語の面接の質問!知識さえああ上昇かもしれません!
1、()関数を取得します
Q:質問に次のコードを見つけてください:
A:上記のコードの問題は、機能を使用する(取得することである)、及び
この関数は、標準入力からのキャッシュボリュームのコピーを確認せずに文字列を受け取り、
これは、バッファオーバーフローを引き起こす可能性があります。()の代わりに標準関数のfgetsを使用することをお勧めします。
2、strcpyの()関数
Q:ここでは、単純なパスワード保護は、ケースであなたはそれを解読するためのパスワードを知ることができない、ですか?
A:キーはブレークのstrcpy()関数の脆弱性を使用して暗号化をクラックすることです。
ユーザーは「passwdの」へのキャッシュランダムなパスワードを入力し、事前に確認していないときに「passwdの」容量が十分です。ユーザーは、十分な原因のバッファオーバーフローやメモリの書き換え長い「パスワード」「フラグ」変数デフォルト位置は、パスワードが確認できない場合でも、存在しているに入るのであれば、フラグの検証ビットが非ゼロになった、それはすることができますデータを保護するために得ます。例えば:
上記のコードが正しくありませんが、我々はまだ、パスワードのセキュリティバイパスにバッファオーバーフローすることができます。
このような問題を回避するために、strncpyを()関数を使用することをお勧めします。
図3に示すように、メイン()戻り型
Q:次のコードは、それをコンパイルすることができますか?もしそうなら、それは潜在的な問題を何をするのでしょうか?
A: main()メソッドの戻り型なので、中のほとんどのコンパイラでエラーコードは警告として扱われます。
main()の戻り値の型は「INT」の代わりに「無効」にする必要があります。そのため、「INT」の戻り値の型は、状態のプログラムに戻ります。これは、プログラムが実行されているプログラムの正常実行に依存としてスクリプトの一部である場合は特に、非常に重要です。
図4に示すように、メモリリーク
Q:次のコードは、メモリがそれをリークする原因は?
A:上記のコードは、「PTR」メモリの解放に割り当てられていないが、プログラムの終了時にメモリリークが発生することはありませんが。プログラムの終了時に、このプログラムは、すべてのメモリを自動的に処分される割り当てます。しかし、中に「whileループ」で上記のコードならば、それは深刻なメモリリークの問題につながります!
5、無料()関数
Q:次のプログラムは、「シマウマ」はないが、ときにユーザー入力「凍結」の問題を引き起こし、なぜでしょうか?
A:ここでの問題は、ループ「ptrは」保存されている間のコードが(「PTR」を増やすことで)アドレスを変更するということです。サイクルは、()の実行前に終了し、自由に渡すため、可変されながら入力「シマウマ」は、malloc関数()のアドレスに渡された場合。しかし、「フリーズ」、「PTR」格納されたアドレスは、このように)(自由に渡されたアドレスが間違っを引き起こし、whileループに変更されるとき、それはSEG-障害またはクラッシュにつながりました。
6.使用_exit出口
Q:次のコードでは、atexitを()が呼び出され、なぜされていませんか?
A: _exit()関数を使用しているので、これは、この機能は、清掃などの呼び出しではないのatexit()関数を実行しています。atexitをした場合()を使用し、出口()、またはそれに関連する「リターン」でなければなりません。
7.void *およびCの構造
Q:あなたはそれが引数のいずれかのタイプを受け入れ、結果(整数)interger関数を返すことができますをデザインすることはできますか?
A:以下の:
int型のFUNC(void *型のPTR)
このパラメータは、構造によって、より機能よりも、この関数が呼び出されるべきであるならば、この構造は、パラメータを渡す必要で充填することができます。
8. * ++および操作
Q:どのような次の操作が出力されますか?なぜ?
A:出力は次のようになります。
"+" と "*" の優先順位として、いわゆる "* PTR ++" 同等 "*(PTR ++)" ので。それは++最初の実装のPTRであるべき、とだけにして* ptrは、その演算の結果が「L」です。2番目の結果は、「I」です。
9. Q:修正コード(または読み出し専用コード)
Q:次のコードセグメントが間違っている、あなたはあなたに指摘することができますか?
A:これは、メモリのコードセグメントの変化=「T」(読み取り専用コード)の「Linux」の最初の文字、* ptrが、からです。この操作は、このようにワンセグ障害またはクラッシュを与え、無効です。
10.彼の名前の進路を変更
Qは:あなたは、実行時に、それを自分の名前を変更するには、プロセスを書くことができますか?
A:以下のコードを参照してください。
11.戻るローカル変数のアドレス
Q:次のコードは、問題がありますか?もしそうなら、どのように修正するには?
:上記の手順は時々正しく実行することができますが、中に「INC()」の重大な欠陥がありますが。この機能は、ローカル変数のアドレスを返します。ローカル変数のライフサイクルは「INC()」ライフサイクルであるので、そのInc.の終わりに、悪い結果が発生したローカル変数を使用します。これは、後にも格納されたアドレス値を変更することができるように、main()の変数のアドレス「」を回避することができます。
12のprintfのプロセスパラメータ()
Q:どのような出力次のコード?
A:出力は次のようになります。
110..40..60
デフォルトのC言語関数のパラメータが出力されると、左から右へ左へ右から処理されるためです。
読んだ後、あなたは新しい知識を学んでいませんか?