c
1#include <stdio.h> 2#include <stdlib.h> 3 4int main(void) 5{ 6 int n=5; 7 int *p; 8 p=malloc(sizeof(int)*n); 9 printf("%d\n",p[1]); //←ここのp[1]では大きな値が表示される 10 for(int i=0;i<10;i++){ 11 printf("%d\n",p[i]); //←ここのp[1]では0と表示される 12 } 13 printf("%d\n",sizeof(p)); //ここではなぜか8と表示される 14 15
上記のコードを実行したところ、上のコメントアウトでも示しましたように
一回目のp[1]では-63789980のような大きな値が表示されておりますが
for文の中でp[1]を取得すると0となっています。
ちなみにループで回った10回文、全て0となっていました。
そして、sizeofでpの確保領域の8となっておりました。領域の長さを5で指定したはずですが、int型の場合は1領域に1.6メモリ使う、と言うようなイメージでしょうか?
自分の認識ですと、pには確保されたメモリ領域の先頭が16進数でhaitteori,p[1]などすると指定されたpにプラス1された値が表示されるのかなと思いました。
なので一回目に大きな値が表示されるのはわかるのですが、for文で中身が全て0になると言うことがわからないです。
ポインターに使う添字演算子の基本がわかっていないと思います。
よろしくお願いもうしあげます。
int n=5;といいながら、for(int i=0;i<10;i++)で10回回しているのは何故でしょう?
pの領域はintで5個(0から4まで)しか有効ではありません。・・・実際はもっと大きいでしょうが(処理系依存)・・・
メモリの領域を確保しているものだと言うことだったので、動作上でどのようになっているかを確認するためにこのように書きました。
> 一回目のp[1]では-63789980のような大きな値が表示されておりますが
> for文の中でp[1]を取得すると0となっています。
私の手元ではそのような症状が出ません。システム、コンパイラは何をお使いでしょうか。実行画面のスクリーンショットなど、出力結果の「生のデータ」をとれますか?
なお、cateyeさん指摘の「確保していないエリアへのアクセス」は未定義動作つまり「何が起こっても文句は言えない」ものです(お暇でしたら'未定義 鼻から悪魔'あたりで検索してみたらいろいろ書かれているかと思います)。その辺は覚悟の上操作を行って下さい。
> printf("%d\n",p[1]); //←ここのp[1]では大きな値が表示される
> for(int i=0;i<10;i++){
> printf("%d\n",p[i]); //←ここのp[1]では0と表示される
普通であれば考えられないです。考えられるとすれば、p[1]で大きな値を出力した後、p[2]以降の出力で何らかのエスケープシーケンスに相当するゴミ文字を出力してしまい、上の行に行ってしまってp[1]の出力内容を上書きしてしまうとか。画面に出力した内容を質問文中に追記してください。ただ、何回かやっているうちに起きなくなってしまうかもしれません。
> p[2]以降の出力で何らかのエスケープシーケンスに相当するゴミ文字を出力してしまい
まぁこれも、printf("%c\n", a[x])ではないから考えづらいのですけど。
今気が付いたのですが、“printf("%d\n",p[1]); //←ここのp[1]では大きな値が表示される”の//の前に全角空白が有りますが?・・・ソースそのままですか?
回答3件
あなたの回答
tips
プレビュー