for
ループのブレーク条件が間違っています! 配列の長さがちょうど. ループ ブレーク条件は < 配列の長さ ( = 11 )である必要がありますが、<配列のサイズではありません。の値は(= 44 )に等しい。i
10
11
sizeof(intArray)
11 * sizeof(int)
それを理解するために読んでください:演算子: sizeof
6.5.3.4 sizeof 演算子、1125:
演算子を配列型に適用するsizeof
と、結果は配列内の合計バイト数になります。
これによれば、 が静的配列識別子 ( /sizeof
を介して割り当てられていない) の名前に適用されると、結果は単なるアドレスではなく、配列全体のバイト単位のサイズになります。これは、各要素のサイズに配列の長さを掛けたものに等しくなります。
つまり、= (長さは 11 です)。したがって、 ifが 4 バイトの場合、 is は44に等しいとします。malloc()
calloc()
sizeof(intArray)
11 * sizeof(int)
intArray
sizeof(int)
sizeof(intArray)
以下のコード例とその出力は、さらに理解するのに役立ちます(コメントを読んでください):
int main(){
int intArray[11] = {1, 2, 8, 12, -13, -15, 20, 99, 32767, 10, 31};
int i = 0;
printf("sizeof(intArray): %d\n",
sizeof(intArray) //1. Total size of array
);
printf("sizeof(intArray[0]): %d\n",
sizeof(intArray[0]) //2. Size of one element
);
printf("length: %d\n",
sizeof(intArray) / sizeof(intArray[0]) //3. Divide Size
);
return 0;
}
出力:
sizeof(intArray): 44 //1. Total size of array: 11 * 4 = 44
sizeof(intArray[0]): 4 //2. Size of one element: 4
length: 11 //3. Divide Size: 44 / 4 = 11
作業コード @ ideoneを確認できます。注: int のサイズは4
.
sizeof(intArray)
配列の長さを超えていることに注意してください。44
したがって、条件が間違っており、実行時にコードで未定義の動作が発生します。それを修正するには、次のように置き換えます。
for(i=0; i < sizeof(intArray); i++)
// ^--replace-----^
// wrong condition = 44
と:
for(i=0; i < sizeof(intArray) / sizeof(intArray[0]); i++)
// ^------------------------------------^
// condition Corrected = 11
配列の長さを計算するには、配列の合計サイズを 1 つの要素のサイズで割るだけで、コードは次のようになります。
sizeof(intArray) / sizeof(intArray[0]) // 44 / 4 = 11
^ ^
total size of size of first element
array