我想用随机零和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();
}
答案 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 运算符。