

No.1ベストアンサー
- 回答日時:
一番シンプルなのは、bbb.c に
extern int gTest[];
と(型が int の場合)書いて、gTest[] の実体が外部にあることを教えてあげれば良いです。
ただし、この場合は、同じ gTest[] を aaa.c と bbb.c からアクセスするので、bbb.c からもgTest[] の書き換えが可能になります。
これを防ぐためには、変数に対してアクセスできるようにするのではなく、aaa.c に例えば、
int getTestValue(int n) { return gTest[n]; }
のような関数を定義して、bbb.c からこの関数経由でgTest[] を参照すると、bbb.c からは gTest[] の書き換えはできなくなります。
さらに言えば、aaa.c における gTest[] の定義の時点で、
static int gTest[2];
としておけば、たとえ、bbb.c で extern int gTest[] と書いても、変数を直接参照することを禁止できます。
aaa.h に
int gTest[2];
と書いて、aaa.c と bbb.c で include しても、「このままでは」 aaa.c と bbb.c の gTest[] は、「同じ名前の別々のもの」になる可能性が高いので、おすすめはできません。
No.3
- 回答日時:
ど~せなら「const な値への const なポインタ」だとは思いますが>#2, それよりは関数の方が自然かなって気はする.
もちろん「ソースコードの切り分けを考え直す」方がより良いのかもしれんが.
No.2
- 回答日時:
要するに、その変数(gTest)を他のモジュールからは読み出し専用で参照させて、書き換えをしない様にしたいのですよね。
それならconstポインタが使えると思います。
ポインタ変数にconst修飾子を付加すると、そのポインタが指す変数は読み出し専用になります。
ポインタのアドレス自体は変更可能ですので、gTestのアドレスにセットすれば期待通りになると思います。
http://www5f.biglobe.ne.jp/~fuku-labo/library/pr …
http://homepage2.nifty.com/tsugu/sotuken/const/
でもC言語のポインタは直接メモリアクセスにコンパイルされているので、コンパイル時にソース中でconstポインタ変数に代入している場所を見つけて警告やエラーで注意してくれる程度だと思います。
実行中もgTestのアドレスのメモリが完全に読み出し専用で保護されている訳ではありませんので、プログラムのミスや何かの拍子で他からの書き換えが起こる可能性はありますね。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
C言語のポインタに直接アドレス...
-
セグメントエラー
-
DelphiでCreateProcessがうまく...
-
アプリを32bitから64bit移行
-
プーさんのマウスポインタを教...
-
Run-Time Check Failure #3とい...
-
ExcelVBAでのkernel32(64bit)
-
クイックソートの比較交換回数...
-
別のDLLのダイアログを・・・
-
リトルエンディアンというもの...
-
PASCALとFARの意味
-
どうしてエラーになるかわかり...
-
DXライブラリ:ポインタと配列?
-
c言語のエラーについて
-
#define NULL ((void *)0) の弊害
-
関数ポインタの型をtypedefした...
-
fopne で失敗する原因
-
LPSTR型の初期化について
-
エラーの意味
-
CWnd::EnableWindow()の扱い方
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
C言語のポインタに直接アドレス...
-
init関数の意味
-
セグメントエラー
-
Run-Time Check Failure #3とい...
-
ExcelVBAでのkernel32(64bit)
-
戻り値で構造体を返すことは可...
-
fopne で失敗する原因
-
参照型で受け取った引数をポイ...
-
ハンドルはポインタか
-
トリプルポインタが必須!とな...
-
LPSTR型の初期化について
-
ポインターの使用法や利点
-
ポインタについて
-
c言語で任意のファイルから読み...
-
基本アルゴリズムの『返す』の...
-
コンストラクタでnewを失敗した...
-
ハンドル、アドレス、ポインタ...
-
アプリを32bitから64bit移行
-
デバイスハンドルとは?
-
NULLとブランクの違い
おすすめ情報