- ベストアンサー
C言語のポインタに直接アドレスを割り振りしたい
C言語のポインタに直接アドレスを割り振りしたいのですが、どうしたら良いのでしょうか?
- みんなの回答 (5)
- 専門家の回答
質問者が選んだベストアンサー
直接アドレスを割り振りたい、というのは int* pnValue; pnValue = (int*)0x12345678 ということでしょうか?このようにすればポインタにアドレスを代入することはできるかと思います。
その他の回答 (4)
- ara_ara
- ベストアンサー率35% (124/348)
>CPUは内部32ビットですが、INTは16ビットです。 で、CPUのアドレス空間は16/32ビットどちらですか? また、ポインタ型のサイズは16/32ビットどちらですか?
お礼
アドレス空間は24ビットで、ポインタ型のサイズは事実上可変長です。 が、みなさんの回答で少しわかってきましたのでどうにかなりそうです。 書き込みをくれたみなさん、ありがとうございました。
- sha-girl
- ベストアンサー率52% (430/816)
>メーカーのコンパイラのスタートアップルーチンでは、メモリクリアもインラインアッセンブルで書いていますから、 >直接番地指定時はインラインアッセンブル以外方法はないものかと半ばあきらめています。 だとすると#1の方の回答のように直接アドレスを入れたので問題ないと思います。 int* p = (int*)0x12345678; *p= 65535;
- jacta
- ベストアンサー率26% (845/3158)
デバイスを制御する目的であれば、例えば volatile unsigned int *io = 0x1234; のようにするとよいでしょう。 特に入力専用の場合には、 const volatile unsigned int *in = 0x1234; とした方が無難です。 フラッシュメモリの種類にもよりますが、書き換えコマンドを期待したシーケンスで発行するためには、volatile修飾が不可欠です。 また、デバイスの種類やモードによっては、アクセスすべき語長が異なるので、必要に応じてunsigned charやunsigned longなどを使うべきです。
- sha-girl
- ベストアンサー率52% (430/816)
例えばWindowsやlinuxの場合で 物理メモリのアドレスを直接指定したいというならそれは無理。 Windowsの場合プロセス毎に仮想メモリ空間を割り当てられており 例えばmalloc等で取得したアドレス=実際の物理メモリのアドレスではない。 意図的にしない限り、誤って他のプロセスのメモリ破壊するような事も 基本的に無いのです。 物理メモリのアドレスはOSが管理しているものです。 >直接アドレスを割り振りしたいのですが 何をしたいのかがもっと具体的に分かれば、詳細な回答を期待 できるかもしれませんよ?
お礼
sha-girlさん、書き込みありがとうございます。 何をしたいか詳しくいいますと、 フラッシュROM内蔵のCPU(制御機器)のプログラムをアセンブラ記述からC記述へ変更しています。 CPUは内部32ビットですが、INTは16ビットです。 フラッシュROM内のデータを書き換えるとき、どうしても直接番地指定が必要となります。 メーカーのコンパイラのスタートアップルーチンでは、メモリクリアもインラインアッセンブルで書いていますから、直接番地指定時はインラインアッセンブル以外方法はないものかと半ばあきらめています。 アセンブル記述で(XHL)や(M)などが行いたいのですが。 宜しくご教示お願いします。
お礼
nitscapeさん、早々の書き込みありがとうございます。 早速試してみたいと思います。