为什么我的数组在初始化后没有合适的长度?

时间:2017-06-06 13:56:36

标签: c arrays

我想用随机零和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();
}

3 个答案:

答案 0 :(得分:3)

array的类型为int *,因此array意义上sizeof(array)的大小是指针值的大小(即32位系统上的4)和64位系统上的8)。

您应该简单地写for (j = 0; j < length; j++)而不是for (j = 0; j < sizeof(array); j++)

答案 1 :(得分:3)

您的问题是sizeof(array)会返回int *的大小,在您的系统上评估为4.只需在第二次迭代中使用j < length作为停止标准。

答案 2 :(得分:0)

解决方法是使用for (j = 0; j < sizeof(array); j++)而不是for (j = 0; j < length; j++)中的sizeof运算符。

另外,我假设你想在数组中有20个0和1的元素。所以你可能想要改变

在第for (i = 1; i < length; i++)

改为使用(i = 0; i < length; i++)

现在解释一下,代码中的主要错误在

for(j = 0; j&lt; sizeof(array); j ++)

sizeof 运算符返回类型的对象表示的字节数。在您的情况下,类型为 int ,因此对于 32位计算机, sizeof运算符将返回4 并且 64位机器它将返回8. 因此在第二个循环中,运行时长度返回为4(您的机器为32位)。

要探索您在第一个循环中输入的所有元素,只需使用相同的长度变量指向数组的每个索引,而不是 sizeof 运算符。