私は最終試験のために私のレビューの一つでこの質問を与えられました。私はそれに少し困惑している。 foo.cにグローバル定義int secret = 4が含まれているとします。
質問(これは、Linux環境でのPuTTYでコンパイルされている):と仮定
foo.c
がグローバル定義int secret = 4;
が含まれており、bar.c
はグローバルな定義が含まれてどうなるchar secret[16];
foo.c
とbar.c
はリンクされていますか?secret
のメモリはどれくらい予約されますか?私は、彼らが同じ名前の両方のグローバル定義されているので、彼らは両方の強い変数であることを、あなたは複数を持つことができないので(つまり、リンカエラー)がコンパイルされませんと思い:私の試み
強い変数..混乱しているところでは、どれくらいのメモリが実際にsecret
のために予約されているかです。おそらくそれは自明ですが、(charは1バイトなので16バイト)+合計4バイトの合計で20バイトになるでしょうか?それはメモリが秘密、または何か他のもののために予約されていないので、リンクしないように、彼らは定義が矛盾している事前
これは私にとって悪い試験問題のように思えます。これは誰もがやるべきことではないからです。基本的には、同じ名前のグローバルな定義が競合しています。私は個人的にはこのエラーが欲しいですが、実際には、初期化された定義が優先され、サイズが4になると思います(4バイトの整数を前提とします)。 –
ああ。あなたの答えの出所を私に送ることができる参考資料はありますか?私はあなたが正しいと思います。 –
_'ld:警告: '...'からのサイズ16の '_secret'の仮定義は、 '...'のより小さいサイズ4の実際の定義に置き換えられています。_ – Oka