1

配列を印刷しようとしていますが、目的の出力が得られません。ループが事前定義された配列の印刷を終了した後、奇妙な数字が表示されます。

コードは次のとおりです。

#include <stdio.h>    
int main(){    
    int intArray[11] = {1,2,8,12,-13,-15,20,99,32767,10,31};
    int i=0;        
    for(i=0;i<sizeof(intArray);i++){
        printf("%d\n",intArray[i]);
    }
}

出力:

1
2
8
12
-13
-15
20
99
32767
10
31
11
1629976468
2674040
2665720
1627423265
1
2665616
-2147417856
1629976534
1629976468
2674040
0
1627423172
1629976532
0
1629110043
0
0
0
0
0
0
0
0
0
0
0
1629976538
0
1629956432
2674276
0
1627407935
4

5 に答える 5

14

forループのブレーク条件が間違っています! 配列の長さがちょうど. ループ ブレーク条件は < 配列の長さ ( = 11 )である必要がありますが、<配列のサイズではありません。の値は(= 44 )に等しい。i1011sizeof(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)intArraysizeof(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   
  
于 2013-08-02T06:00:52.267 に答える
4

sizeof要素ではなくバイト単位で配列のサイズを示します。要素の数を取得するには、1 つの要素のみのサイズで割ります。

for(i = 0; i < (sizeof intArray / sizeof intArray[0]); i++)
{
    printf("%d\n", intArray[i]);
}

これは配列型でのみ機能することに注意してください。 を使用してメモリのブロックを割り当てた場合は機能しませんmalloc

于 2013-08-02T06:00:20.217 に答える
3

sizeof(intArray)に変更する必要があります

sizeof(intArray)/sizeof(int)

これにより、配列要素の数が得られます。

于 2013-08-02T06:01:36.870 に答える
2

intArray11 の配列として宣言しましたint。それぞれintがメモリ内で特定のバイト数 (通常は 4) を占有します。したがって、全体のサイズintArrayは 11 * 4 = 44 バイトです。

あなたが言うときi < sizeof(intArray)、あなたはそれゆえに言っていi < 44ます。しかし、配列には 44 ではなく、11 の要素しかありません! したがって、ループは配列の境界を超えて続行します。引き続き 4 バイトのチャンクを読み取り、それらを整数として解釈し、ガベージ値を出力します。

そのため、ループ条件を次のようにする必要があるとすべての回答が言っています

i < sizeof(intArray) / sizeof (intArray[0])

配列内の要素の数を取得するには、配列全体のサイズを 1 つの要素のサイズで割る必要があります。要素の数はすでにわかっているので、もっと単純にして、次のように言うことができます。

i < 11

ただし、配列のサイズがわからない可能性があるより一般的なケースでは、他の提案されたループ条件を使用する必要があります。

于 2013-08-02T06:24:42.443 に答える
2

アップデート

for(i=0;i<sizeof(intArray);i++)

for(i=0;i<sizeof(intArray)/sizeof(intArray[0]);i++)

sizeof(intArray)配列内の要素の数ではなく、配列の合計サイズをバイト単位で示します。

于 2013-08-02T06:01:12.193 に答える