2017-06-06 10 views
-1

可変長の配列をランダムなゼロと1で初期化したい。私の問題は、私が作成した配列は4要素の長さしか持たないようです。 なぜですか?配列の初期化後に配列の長さが正しくないのはなぜですか?

int main() 
{ 
    int i, j; 
    int length = 20; 
    int *array = (int *) calloc(length, sizeof(int)); 
    for (i = 1; i < length; i++) { 
     array[i] = 1; 
     printf("%d", array[i]); 
    } 
    printf("\n"); 
    for (j = 0; j < sizeof(array); j++) { 
     printf("%d", array[j]); 
    } 
    getchar(); 
} 
+1

[関数に渡すとC-配列の値が正しくないのはなぜですか?](https://stackoverflow.com/questions/2950332/why-does-ac-array-have -a-wrong-sizeof-value-when-passed-a-function) –

+0

ありがとう、それは私の質問への答えであることが判明しました。 – MrCGenius

答えて

0

解決策は、for (j = 0; j < sizeof(array); j++)のsizeof演算子の代わりに、for (j = 0; j < length; j++)を使用します。

また、配列内に0と1の20要素が必要です。だから、代わりに(i = 0; i < length; i++)のためのラインfor (i = 1; i < length; i++)

使用中

を変更したい場合があります。 のsizeofオペレータ戻るにおけるサイズ

今説明のために、コードの主バグが(J ++; J <はsizeof(配列)J = 0)のためのライン

であります型のオブジェクト表現のバイト。あなたのケースではタイプは、従って32ビットマシンに対して、sizeof演算子は4を返し、64ビットマシンのそれは8だから第二のループに、実行時の長さが返される戻り、INTあります4(あなたのマシンは32ビット)です。

だけ代わりのsizeofオペレータの配列の各インデックスを指すために同じ変数を使用し、最初のループで入力を持つすべての要素を探索します。

+0

ありがとう!だから私の配列の名前が配列そのものを表すのか、それとも最初の要素へのポインタなのか、どうすれば正確にわかりますか? – MrCGenius

+0

配列のメモリを割り当てて、それにポインタを割り当てています。ポインタは常に最初のインデックスのアドレスを指していて、それを反復するにつれてインクリメントします。そして、これは一定の大きさで宣言された配列のための一般的なものです。 –

3

arrayのタイプはint *ので、sizeof(array)の意味でarrayの大きさは、ポインタ値(すなわち、4〜32のビットシステムと8 64のビットシステム)のサイズです。

for (j = 0; j < sizeof(array); j++)の代わりにfor (j = 0; j < length; j++)と書くだけです。

3

sizeof(array)は、int *のサイズを返します。システムでは4と評価されます.2回目の繰り返しでは、j < lengthを停止基準として使用してください。

関連する問題