197


組込み環境でC言語で開発しています。C言語の規約上、ヌルポインタを代入したい場合

[code]

    int *nullp = 0;
    
[/code]

と書かなければいけませんが、 私の環境では 0番地に NOR がマッピングされています。（上のコードはコンパイルすると物理的には
0番地ではなく、0x3FFFFFFFのような番地が代入されます）

0番地にアクセスする(0番地へのポインタを代入する)にはどうすれば良いでしょうか？


CC BY-SA 3.0
2014-11-25T12:04:07.320
185
2017-07-24T12:41:10.450
2014-11-26T03:52:25.063
79
79
question
c ポインタ
0番地ポインタの設定方法


コンパイラが割り当てているということでしたら、 stddef.hをインクルードしてNULLを使えば適切なヌルポインタが入ってくれないでしょうか。


CC BY-SA 3.0
2014-11-26T01:05:43.543
191
2014-11-26T01:05:43.543
70
185
answer


そのコンパイラが ANSI (ISO/JIS) C に準拠しているという前提であれば、ポインタの文脈で 0
を与えると必ずナルポインタを得ることが出来ます。(キャストしていないので、警告は出るかもしれませんが。)

ですので、そのコンパイラは 0x3FFFFFFF をナルポインタとして利用する珍しいコンパイラなのだと思います。(値が 0x3FFFFFFF
であったとしても、nullp == 0 は真になりますし、nullp 自体は偽と見なされます。)

ただし、組み込み用のコンパイラは ANSI C に準拠していないことも多いようなので、正確なところはドキュメントを参照するのが良いかと思います。


CC BY-SA 3.0
2014-11-26T02:15:13.790
192
2014-11-26T02:15:13.790
76
185
answer


いろいろ調べてコーディングが一番シンプルなのは

[code]

      uintptr_t address = 0;
      int *p = (int *) address;
    
[/code]

でした([Could I ever want to access the address
zero?](https://stackoverflow.com/questions/2761360/could-i-ever-want-to-
access-the-address-zero))。

ただコード上わかりにくい気はします。コメントを書いておく位しかないかもしれません。


CC BY-SA 3.0
2014-11-26T05:26:09.490
197
2014-11-26T05:26:09.490
2017-05-23T12:38:56.467
-1
79
185
answer


unionを使うとか。

[code]

    union {
      int *nullp;
      int i;
    } hoge;
    hoge.i = 0;
    
[/code]

ただし、`sizeof(int) == sizeof(int *)`を仮定している悪いコードです。

あるいはmemsetをつかうとか。

[code]

    int *nullp;
    memset((void *)&nullp, 0, sizeof(nullp));
    
[/code]


CC BY-SA 3.0
2014-12-17T13:40:47.347
1930
2014-12-17T13:40:47.347
3413
185
answer