- 【初心者歓迎】C/C++室 Ver.94【環境依存OK】 [転載禁止]©2ch.net
800 :デフォルトの名無しさん[sage]:2015/02/01(日) 12:49:21.99 ID:ofkZJOEV - 一次元配列のメモリ領域の一部分を借りて変数の配列にしてるんだから、
配列外にアクセスしたら別の変数にアクセスしてしまう場合もあるわな
|
- 【初心者歓迎】C/C++室 Ver.94【環境依存OK】 [転載禁止]©2ch.net
802 :デフォルトの名無しさん[sage]:2015/02/01(日) 13:02:28.61 ID:ofkZJOEV - > ってやると、 A \0 \0 って3文字分メモリを取って
解読してくれよエスパー
|
- 【初心者歓迎】C/C++室 Ver.94【環境依存OK】 [転載禁止]©2ch.net
809 :デフォルトの名無しさん[sage]:2015/02/01(日) 14:08:25.74 ID:ofkZJOEV - >>807
どっちも 'A'と'\0'の2バイトをコピーするよ、 ただしstrcpyはコピー先の確保メモリ数なんて考慮しないから、 下の方は確保領域外であるa[0]の次に'\0'を書き込んじゃうのでよろしくない
|
- 【初心者歓迎】C/C++室 Ver.94【環境依存OK】 [転載禁止]©2ch.net
812 :デフォルトの名無しさん[sage]:2015/02/01(日) 14:41:54.37 ID:ofkZJOEV - >>811
いや、違う 配列外が'\0'になってるのはOSがよろしくやってくれてるだけで、 環境が違えばメモリ確保領域外にゴミデータが入ってる事なんてよくある、 メモリ確保領域外がすべて0クリアされてる前提でコードを組むのは環境依存になるし、お作法的にもやっちゃダメ > その領域を使ってた変数などが先頭が\0になって壊れると言う事ですね。 こっちも、変数のフラグメンテーションによって配列外アクセスが常に別の変数の先頭領域になるなんて保障がないよ
|
- 【初心者歓迎】C/C++室 Ver.94【環境依存OK】 [転載禁止]©2ch.net
813 :デフォルトの名無しさん[sage]:2015/02/01(日) 14:48:51.05 ID:ofkZJOEV - あ、ちなみに、配列内なら初期値以降が0クリアされるって言語仕様で決められてるよ
例えば int a[3] = {0}; だと、a[0] == 0、a[1] == 0、a[2] == 0 int a[3] = {5, 2}; だと、a[0] == 5、a[1] == 2、a[2] == 0 char a[3] = "A"; だと、a[0] == 'A'、a[1] == '\0'、a[2] == 0('\0')
|