14歳の自分に衝撃の事実を告げてください

C言語のポインタに直接アドレスを割り振りしたいのですが、どうしたら良いのでしょうか?

A 回答 (5件)

直接アドレスを割り振りたい、というのは


int* pnValue;
pnValue = (int*)0x12345678
ということでしょうか?このようにすればポインタにアドレスを代入することはできるかと思います。
    • good
    • 7
この回答へのお礼

nitscapeさん、早々の書き込みありがとうございます。
早速試してみたいと思います。

お礼日時:2005/02/26 14:05

>CPUは内部32ビットですが、INTは16ビットです。


で、CPUのアドレス空間は16/32ビットどちらですか?
また、ポインタ型のサイズは16/32ビットどちらですか?
    • good
    • 0
この回答へのお礼

アドレス空間は24ビットで、ポインタ型のサイズは事実上可変長です。
が、みなさんの回答で少しわかってきましたのでどうにかなりそうです。
書き込みをくれたみなさん、ありがとうございました。

お礼日時:2005/02/28 09:15

>メーカーのコンパイラのスタートアップルーチンでは、メモリクリアもインラインアッセンブルで書いていますから、


>直接番地指定時はインラインアッセンブル以外方法はないものかと半ばあきらめています。

だとすると#1の方の回答のように直接アドレスを入れたので問題ないと思います。
int* p = (int*)0x12345678;
*p= 65535;
    • good
    • 3

デバイスを制御する目的であれば、例えば



volatile unsigned int *io = 0x1234;

のようにするとよいでしょう。
特に入力専用の場合には、

const volatile unsigned int *in = 0x1234;

とした方が無難です。
フラッシュメモリの種類にもよりますが、書き換えコマンドを期待したシーケンスで発行するためには、volatile修飾が不可欠です。
また、デバイスの種類やモードによっては、アクセスすべき語長が異なるので、必要に応じてunsigned charやunsigned longなどを使うべきです。
    • good
    • 2

例えばWindowsやlinuxの場合で


物理メモリのアドレスを直接指定したいというならそれは無理。
Windowsの場合プロセス毎に仮想メモリ空間を割り当てられており
例えばmalloc等で取得したアドレス=実際の物理メモリのアドレスではない。
意図的にしない限り、誤って他のプロセスのメモリ破壊するような事も
基本的に無いのです。
物理メモリのアドレスはOSが管理しているものです。

>直接アドレスを割り振りしたいのですが
何をしたいのかがもっと具体的に分かれば、詳細な回答を期待
できるかもしれませんよ?

参考URL:http://nienie.com/~masapico/doc_MemMan.html
    • good
    • 0
この回答へのお礼

sha-girlさん、書き込みありがとうございます。
何をしたいか詳しくいいますと、
フラッシュROM内蔵のCPU(制御機器)のプログラムをアセンブラ記述からC記述へ変更しています。
CPUは内部32ビットですが、INTは16ビットです。
フラッシュROM内のデータを書き換えるとき、どうしても直接番地指定が必要となります。
メーカーのコンパイラのスタートアップルーチンでは、メモリクリアもインラインアッセンブルで書いていますから、直接番地指定時はインラインアッセンブル以外方法はないものかと半ばあきらめています。
アセンブル記述で(XHL)や(M)などが行いたいのですが。
宜しくご教示お願いします。

お礼日時:2005/02/26 15:28

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

このQ&Aを見た人はこんなQ&Aも見ています


おすすめ情報

このQ&Aを見た人がよく見るQ&A