- ベストアンサー
ポインタ
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バイト分はみ出してしまいますが、 存在しないアドレスを参照しようとするとエラーになるかと思いますが ポインタを動かすだけだと問題ないのでしょうか? 処理系やコンパイラに依るのでしょうか。 初心者ですがよろしくお願いします。
- みんなの回答 (3)
- 専門家の回答
質問者が選んだベストアンサー
>ポインタを動かすだけだと問題ないのでしょうか? ポインタが指し示す内容を参照しなければ平気です。 NULLポインタがいい例だと思います。 char * p; char * q; char c; p = NULL; q = p; /*これはOK*/ c = *p; /*これはNG*/
その他の回答 (2)
- a-kuma
- ベストアンサー率50% (1122/2211)
ポインタを動かしただけでは何も問題が起きない、というのは先の回答の通りです。 因みに、質問に出された関数はビッグエンディアンをリトルエンディアンに変える 関数のようですが、これでは2バイトの領域だけにしか通用しません。 例えば、0x01020304 という4バイトの整数のメモリイメージは以下のようになります。 ←低 高→ ┌─┬─┬─┬─┐ │01│02│03│04│ビッグエンディアン └─┴─┴─┴─┘ ┌─┬─┬─┬─┐ │04│03│02│01│リトルエンディアン └─┴─┴─┴─┘ 隣り合ったバイトを交換するだけでは(普通は)駄目です。 ビッグエンディアンでもリトルエンディアンでもない処理系もあったような 気もします。そのような系を相手にしているのであれば、この回答は気にせず 読み飛ばしてください。
お礼
勉強になります。 4バイトについては考えていませんでした。 ご回答ありがとうございました。
- osamuy
- ベストアンサー率42% (1231/2878)
実際に、そのポインタで、メモリにアクセスしないかぎり、エラーにならないです。 でなかったら、例えば、NULLを入れただけで、エラーになってしまいますよね。 もちろん、そういったレンジチェックを行う処理系もあるかもしれませんが、普通はそこまでやってないと思います。
お礼
参考になりました。 ご回答ありがとうございます。
お礼
的確なご回答ありがとうございます。