第9講 箱の住所を入れる箱(ポインタ)
第4話 ポインタを配列のように使う
前話の疑問に対する解答は、次話までお待ちください。
コードさらに次のように変えてみましょう。
#include<stdio.h>
#include <stdlib.h>
int main(){
int *a;
a=(int *)malloc(8);
a[0]=8;
a[1]=10;
printf("%d\n",a[0]);
printf("%d\n",a[1]);
}
ビルドするとどうなるでしょうか。
実行結果
どうも配列と同様にして使えそうです。
そこで、調子に乗って
#include<stdio.h>
#include <stdlib.h>
int main(){
int *a;
a=(int *)malloc(8);
a[0]=8;
a[1]=10;
a[2]=12;
printf("%d\n",a[0]);
printf("%d\n",a[1]);
printf("%d\n",a[2]);
}
などとしたらどうでしょうか。
多分ビルド結果は、
上手くいく場合と失敗する場合があるでしょう。
実は上手くいった場合でも、
このコードには問題があります。
何が問題でしょう。
解答は30行下。
解答
a=(int *)malloc(8);
によって、メモリー割り当ては2個分しか用意していないのに、
a[2]=12;
によって3個目の箱を使おうとした。
理論的には問題があるコードでも、
実験すると結果が出てしまったり、
失敗したりします。
理論的には問題あるコードが、
なぜ、上手くいってしまう場合があるのでしょうか。
私の推測ですが、メモリーのバッティングが起きなければ、
a=(int *)malloc(8);
で初期化してあっても、50個でも100個でも使える、
ということだと思います。
メモリーのバッティングとは、
同じメモリー領域を2つ以上のソフト(またはプログラム)
が使うことをいいます。
a=(int *)malloc(8);
と初期化(メモリー割り当て)がされているとき、
C++は、8バイト連続して空である
(他のソフトが使っていない)メモリー領域を探し、
それを割り当てるので、バッティングは起きません。
C++が割り当てた8バイトの領域以降もたまたま
ほかのソフト等が使っていなければ、バッティングが起きず、
上手くいってしまう場合がある・・・
ということだと思います。
さて、前話の問題 なぜ、ポインタは配列のように使用できるの?
の疑問に次話で答えることにしましょう。
第3話へ 第5話
初心者のためのjava 入門 基礎から応用まで
初心者のための VC++による C言語 入門 C++ 入門 基礎から応用まで第1部
初心者のための VC++による C言語 入門 C++ 入門 基礎から応用まで第2部
初心者のための VC++による C言語 入門 C++ 入門 基礎から応用まで第3部
初心者のための世界で一番わかりやすいVisual Basic入門基礎講座へ
初心者のための世界で一番わかりやすいVisual C++入門基礎講座へ
VC++入門
VBA入門
専門用語なしのVBA入門
VB入門
初心者のためのEclipseによるJava入門