• ベストアンサー

ポインタ

long ToLittleEndian(char *a,long bytesize){ long i; char lb; char hb; long lsize; lsize=bytesize/2; for (i=0;i<lsize;i++){ hb=*(a++); lb=*(a--); *(a++)=lb; *(a++)=hb; } return 0; } ポインタのアドレスがはみだすとどうなるのでしょうか? 上記のようなコードの場合、最後の処理でポインタaが1バイト分はみ出してしまいますが、 存在しないアドレスを参照しようとするとエラーになるかと思いますが ポインタを動かすだけだと問題ないのでしょうか? 処理系やコンパイラに依るのでしょうか。 初心者ですがよろしくお願いします。

質問者が選んだベストアンサー

  • ベストアンサー
  • taka_tetsu
  • ベストアンサー率65% (1020/1553)
回答No.1

>ポインタを動かすだけだと問題ないのでしょうか? ポインタが指し示す内容を参照しなければ平気です。 NULLポインタがいい例だと思います。 char * p; char * q; char c; p = NULL; q = p; /*これはOK*/ c = *p; /*これはNG*/

sha-girl
質問者

お礼

的確なご回答ありがとうございます。

その他の回答 (2)

  • a-kuma
  • ベストアンサー率50% (1122/2211)
回答No.3

ポインタを動かしただけでは何も問題が起きない、というのは先の回答の通りです。 因みに、質問に出された関数はビッグエンディアンをリトルエンディアンに変える 関数のようですが、これでは2バイトの領域だけにしか通用しません。 例えば、0x01020304 という4バイトの整数のメモリイメージは以下のようになります。 ←低     高→ ┌─┬─┬─┬─┐ │01│02│03│04│ビッグエンディアン └─┴─┴─┴─┘ ┌─┬─┬─┬─┐ │04│03│02│01│リトルエンディアン └─┴─┴─┴─┘ 隣り合ったバイトを交換するだけでは(普通は)駄目です。 ビッグエンディアンでもリトルエンディアンでもない処理系もあったような 気もします。そのような系を相手にしているのであれば、この回答は気にせず 読み飛ばしてください。

sha-girl
質問者

お礼

勉強になります。 4バイトについては考えていませんでした。 ご回答ありがとうございました。

  • osamuy
  • ベストアンサー率42% (1231/2878)
回答No.2

実際に、そのポインタで、メモリにアクセスしないかぎり、エラーにならないです。 でなかったら、例えば、NULLを入れただけで、エラーになってしまいますよね。 もちろん、そういったレンジチェックを行う処理系もあるかもしれませんが、普通はそこまでやってないと思います。

sha-girl
質問者

お礼

参考になりました。 ご回答ありがとうございます。