2017-06-06 78 views
-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數組在傳遞給一個函數時有一個錯誤的sizeof()值?](https://stackoverflow.com/questions/2950332/why-does-ac-array-have -a-wrong-sizeof-value-when-its-to-a-function) –

+0

謝謝,這原來是我的問題的答案。 – MrCGenius

回答

0

解決方法是,而不是for (j = 0; j < sizeof(array); j++)中的sizeof運算符,請使用for (j = 0; j < length; j++)

另外,我認爲你想在數組中有20個0和1的元素。所以,你可能想改變

在該行for (i = 1; i < length; i++)

使用了(i = 0; i < length; i++)代替。

現在的說明中,將碼初級缺陷是在該行

對於(j = 0;Ĵ<的sizeof(數組); J ++)

的sizeof操作者返回大小在類型的對象表示的字節。在你的情況的類型是INT,因此對於一個32位機,sizeof操作將返回4和用於64位機將返回8.所以在第二循環中,將返回運行時長度作爲4(你的機器是32位)。

要探索所有你必須在第一回路輸入端的元件,只是使用相同長度變量指向數組代替的sizeof操作者的每個索引。

+0

謝謝!那麼,我怎麼知道我的數組名稱是代表數組本身,還是隻是指向其第一個元素的指針呢? – MrCGenius

+0

您正在爲數組分配內存併爲其指定一個指針。指針總是指向第一個索引的地址,然後在迭代它時遞增。這對於以確定大小聲明的數組也是通用的。 –

3

類型的arrayint *,所以在arraysizeof(array)意義上的大小是一個指針值的大小(即,4在32位的系統和8上的64位系統)。

您應該簡單地寫for (j = 0; j < length; j++)而不是for (j = 0; j < sizeof(array); j++)

3

您的問題是,sizeof(array)會返回您的系統評估爲int *的大小。只需在第二次迭代中使用j < length作爲停止標準。

相關問題