![](http://oshiete.xgoo.jp/images/v2/pc/qa/question_title.png?8acaa2e)
![](http://oshiete.xgoo.jp/images/v2/common/profile/M/noimageicon_setting_04.png?8acaa2e)
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で質問しましょう!
似たような質問が見つかりました
- Excel(エクセル) ¥マークを含むパスの処理について(マクロ、または関数) 2 2022/12/25 02:11
- Perl perl このテキストファイルを簡単に配列に入れるには? 2 2022/04/27 20:24
- JavaScript jsonテキストデータの並び替えができるサービスを教えてください 2 2022/08/05 20:16
- Excel(エクセル) Excel VBA 3 2023/04/22 10:46
- Visual Basic(VBA) 別ブックからシートのコピー 3 2022/04/01 20:07
- JavaScript JavaScript|特定URLだった時、特定の要素を変更するコードの書き方を教えてほしいです 2 2023/08/25 21:43
- SQL Server ACCESSで3ファイルを結合して、表を作成するやり方を教えて下さい。 17 2022/08/15 20:34
- JavaScript 指定したパスが現URLに含まれていたら特定要素を削除するJavascriptのコードを教えてください 2 2023/04/27 17:58
- その他(データベース) カラム上の重複を削除するクエリを教えてください 3 2022/04/12 14:11
- SQL Server ACCESSで複数テーブルを結合して、リストを作る方法を教えてください。 2 2022/08/12 19:32
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
init関数の意味
-
fopne で失敗する原因
-
セグメントエラー
-
任意のアドレスの中身を参照し...
-
C言語のポインタに直接アドレス...
-
Run-Time Check Failure #3とい...
-
パスからファイル名を抽出
-
ポインタについて
-
main(int argc,char **argv[])...
-
戻り値で構造体を返すことは可...
-
構造体とfscanf
-
ハンドルはポインタか
-
ポインタ引数をさらにポインタ...
-
Cで作成したDLL関数をVBから呼...
-
NULLポインタは0と書かなければ...
-
TCHAR文字列内の検索について
-
自作strcat
-
C言語グローバル変数
-
CWnd::EnableWindow()の扱い方
-
NULLポインタが0でない処理系と...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
セグメントエラー
-
C言語のポインタに直接アドレス...
-
fopne で失敗する原因
-
init関数の意味
-
Run-Time Check Failure #3とい...
-
戻り値で構造体を返すことは可...
-
LPSTR型の初期化について
-
Cで作成したDLL関数をVBから呼...
-
ExcelVBAでのkernel32(64bit)
-
アプリを32bitから64bit移行
-
構造体とfscanf
-
c言語で任意のファイルから読み...
-
デバイスハンドルとは?
-
main(int argc,char **argv[])...
-
基本アルゴリズムの『返す』の...
-
コンストラクタでnewを失敗した...
-
C言語の関数と配列に関する質問
-
ハンドル、アドレス、ポインタ...
-
参照型で受け取った引数をポイ...
-
DLL<->VB間での受け渡し(文字...
おすすめ情報