2017-04-17 7 views
-4

私はこのコードでは奇妙なバグが発生しました:私は期待出力がされているはずのに対し、配列、出力= 2,3、...、19 0memcpyが元の配列の最後の要素を変更するのはなぜですか?

をプリントアウトした場合

int *a = (int*) malloc(N*sizeof(int)); // allocate array 
int i; 
for (i=2; i<=N; i++) 
{ 
    a[i] = i; 
} 

int *b = (int*) malloc(N*sizeof(int)); 
memcpy(b, a, N*sizeof(b)); 

を2,3、...、19,20。

bに配列をコピーすると、最後の要素に不思議な影響があります。

+0

あなたの問題とは関係ありません:あなたの最終行に 'N * sizeof(b)'を使用するべきかどうか不安です。 'sizeof(b)'はintポインタのサイズを与えますが、intのサイズを指定します。 –

+0

私は 'i <= N'のために' BAD_ACCESS'を期待していました –

+0

sizeof(b)を使うとエラーになります。 sizeof(int)を使用した場合、出力は同じです –

答えて

2

Nの要素の配列は、有効なインデックス0,1、...、N - 1を持っています。あなたの最終ループラウンドは、境界外にあり、未定義の振る舞いを持つa[N]にアクセスします。

+0

それと、彼の 'memset'は、32ビット整数の64ビットシステムでは終わりを迎えます。 – dasblinkenlight

+0

ありがとう、ありがとう –

関連する問題