前提・実現したいこと
ポインタ移動による配列列挙を実現したい。
###C言語コード
//自作プログラム ポインタ理解用 #include <stdio.h> int main(void){ int *p,*p1; int i,n,x; int v[5]={1,2,3,4,5}; i=10; p=&i; /*ポインタ変数にiのアドレスを代入*/ printf("iのアドレスは%p,iは%dです\n",p,i); //iのアドレス,iは10 *p=15; /*ポインタ変数のアドレスを見て、その番地の値を15とする( pにiのアドレスが入ってるから*pは15になりiも15となる)*/ printf("pは%d,iは%dです\n",*p,i); //15,15 p1=v;//配列vの先頭アドレス代入 printf("vの先頭アドレスは%pです\n",p1); *p1=5; //v[0]を5に変更 for(n=1;n<6;n++){ printf("vの%d番目は%dです\n",n,(*p1)++);//v[0]の値しか表示していない,*p1は更新されている } printf("v[3]の値は%d\n",v[3]); putchar('\n'); for(n=1;n<6;n++){ //❶配列番号により配列列挙 printf("vの%d番目は%dです\n",n,*p1++);/* v[0]~v[4]を表示、 これまでの処理でv[1]~v[4]は変更されていない*/ } printf("v[3]の値は%d\n",v[3]); putchar('\n'); for(n=1;n<6;n++){ printf("vの%d番目は%pです\n",n,p1++);/* v[0]~v[4]のアドレス表示,int型4bitごと*/ } printf("v[3]の値は%d\n",v[3]); putchar('\n'); while(*p!='\0'){ //ポインタ移動により❶のように配列列挙したい。うまくいかない printf("vの%d番目は%dです\n",x,*p1);/* v[0]~v[4]表示したいが、v[298]まで出る*/ x++; p1++; //次のアドレスを参照するために4bitずらす } return 0; } ``` ###知りたいこと ポインタが理解できなかったため、自分でプログラムを書き、配列番号を変えて配列を列挙するのではなくポインタをずらして配列を列挙しようとした際に配列の数[5]を超えて表示されてしまう。最後のfor文がいけないが、なぜいけないのかがわからないので教えて欲しいです。 ### 発生している問題・エラーメッセージ 実行結果の最後に”Segmentation fault: 11”が表示される。私はv[0]からv[4]の5つの要素を表示しようとプログラムを書いたがそれ以上に表示されてしまう上、v[0]~v[4]の値も予想外の結果になってしまった。 ### 実際の出力結果 iのアドレスは0x7ffee8762b14,iは10です pは15,iは15です vの先頭アドレスは0x7ffee8762b30です vの1番目は5です vの2番目は6です vの3番目は7です vの4番目は8です vの5番目は9です v[3]の値は4 vの1番目は10です vの2番目は2です vの3番目は3です vの4番目は4です vの5番目は5です v[3]の値は4 vの1番目は0x7ffee8762b44です vの2番目は0x7ffee8762b48です vの3番目は0x7ffee8762b4cです vの4番目は0x7ffee8762b50です vの5番目は0x7ffee8762b54です v[3]の値は4 vの1番目は1488765909です vの2番目は32767です vの3番目は1488765909です vの4番目は32767です vの5番目は0です vの6番目は0です vの7番目は1です vの8番目は0です vの9番目は-394908528です vの10番目は32766です vの11番目は0です vの12番目は0です vの13番目は-394908519です vの14番目は32766です vの15番目は-394908491です vの16番目は32766です vの17番目は-394908475です vの18番目は32766です vの19番目は-394908455です vの20番目は32766です vの21番目は-394908398です vの22番目は32766です : : vの296番目は2016422964です vの297番目は1650602289です vの298番目は3236146です Segmentation fault: 11
回答2件
あなたの回答
tips
プレビュー