2016-10-24 4 views
0

私が作っている次のCプログラムで誰かが私を助けることができるのだろうかと思います。コードは単純にポインタを作成し、次に整数配列のアドレスが割り当てられます。そこから、ポインタに値が与えられ、その後インクリメントされます。 出力には、アレイ名、配列アドレス、配列値が表示されます。出力は期待通りに機能しますが、配列内の最後の項目が1つではなく5ずつ増加します。Cポインターインクリメント偽値付きプログラム

コードを以下に示す:

#include <stdio.h> 

main() 
{ 
    int numar[4];  //integer array 
    int x;    //value for loop 
    int *p;    //pointer 
    p=numar;   //'point' p to address of numar array (no & necessary as arrays are pointers) 
    for(x=0;x<5;x++) //loop 0-4 
    { 
     *p=x;   //assign the value of the first item in array to x 
     p++;   //increment pointer for next iteration 
    } 
    for(x=0;x<5;x++) //loop 0-4 
    { 
     //display output of array name, array location and array value 
     printf("array[%d] is at address %p with value %d\n", x,&numar[x],numar[x]); 
    } 
    return 0; 
} 

上記のコードの出力を以下に示す:あなたが見ることができるように

array[0] is at address 0061FF18 with value 0 
array[1] is at address 0061FF1C with value 1 
array[2] is at address 0061FF20 with value 2 
array[3] is at address 0061FF24 with value 3 
array[4] is at address 0061FF28 with value 8 

、アレイに対する所望の値[4]が4であるべきです代わりに8です。

ご協力いただければ幸いです。

多くのおかげで、

+10

'int numar [4]; 'しかし、あなたはインデックス4にアクセスしているようです(最大有効値は3です)。したがって、配列の最後から実行され、未定義の動作が呼び出されます。ここでは鼻悪魔が来る.... – John3136

+1

'[4]'は配列に4つの要素があることを意味します。 –

+0

配列は***ポインタではありません***。配列に評価される(サブ)式は、その配列の最初の要素へのポインタに "崩壊"します(したがって、割り当てが機能します)が、それはまったく異なるものです。 –

答えて

2

あなたのコードのコンパイルを行うためには、私は1つの変更をしなければならなかった:主な機能が正しく0

を返すことができるように、私は、「メイン」の前に「INT」を追加しました問題は、サイズ4の整数配列を作成したが、その配列に5つの項目が含まれていてほしいということです。したがって、

numar[4] 

が未定義

numar[0] 
numar[1] 
numar[2] 
numar[3] 

int numar[4]; 

ことはあなたのアレイが4つの要素のために定義されていることを意味します。あなたの配列が1つのサイズ大きくし、これを修正するには

:私が得る

int numar[5]; 

出力は次のようになります。

array[0] is at address 0x7fff557f0730 with value 0 
array[1] is at address 0x7fff557f0734 with value 1 
array[2] is at address 0x7fff557f0738 with value 2 
array[3] is at address 0x7fff557f073c with value 3 
array[4] is at address 0x7fff557f0740 with value 4 
+0

お返事ありがとうございました。私のために愚かな間違い。 – chrismason954

1

あなたは、配列のために使用されているインデックスに問題があります。

int numar[4]で4要素配列を作成しています。これにより、有効なインデックス0,1,2および3を持つ配列が作成されます。インデックスはありません[4]ここに!したがって

、後で充填およびforループ内の配列にアクセスしている、あなたは、このようにそれらを設定する必要があります。

for(x = 0; x < 4; x++) { 

x < **4**、ない5。このループはインデックス0,1,2および3をチェックします。

ループには、配列に属していない要素[4]がアクセスします。

2

申し訳ありませんが、配列のインデックスを1から始めるようにする方法がありませんので、0から始まるので、4要素の配列がある場合、最後の要素はインデックス3が4でない要素です。

あなたのコードには、4つの要素の配列しかない5つの要素があります。

for(x = 0; x < 5; x++) // iterating five times not 4: 0, 1, 2, 3, 4 
    //.... 

*配列の非要素に書き込むための最悪のものは他の変数などにドングルです:

int a = 0; // initialized to avoid compiler complaining later on 
int numar[4] = {0, 1, 2, 3}; // ok 
numar[4] = 77; // writing to the fifth element which doesn't belong to numar. as you can see variable a right before numar 

cout << a << endl; // a: 77!! where did a get this value? because a is right before numar so element five which doesn't belong to numar was allocated to a 

この例では、我々は他の変数に意図せずdongled(a)のアブド最も欲求不満なことは、コンパイラが(0に初期化した) という文句を言っていないということです。結果は、巨大なコードの中にあるエラーを起こしやすく、キャプチャが不可能に見えます。

関連する問題