对于静态分配的数组,您可以将总大小(以字节为单位)除以一个元素的大小(以字节为单位):
int array[512];
size_t arraySize = sizeof(array) / sizeof(*array) // = 512
对于动态分配的数组,您必须手动跟踪大小。这意味着,在创建数组时存储大小并在重新分配数组时更新该值。
从问题和 cmets 中,我了解到您想从 stdin 读取整数(我想直到 EOF)。有几种方法可以做到这一点:
1.分配一个最大大小的数组并打印每个其他元素
int array[1000];
size_t size = 0;
while (scanf("%d", &array[size]) != EOF)
++size;
for (size_t idx = 0; idx < size; idx += 2)
printf("%d\n", array[idx]);
2。分配最大大小的一半并存储每隔一个元素
由于并非所有元素都在输出中使用,我们不妨只存储我们需要的元素。在scanf 格式说明符中使用* 丢弃第二个整数。
int array[500];
size_t size = 0;
while (scanf("%d%*d", &array[size]) != EOF)
++size;
for (size_t idx = 0; idx < size; ++idx)
printf("%d\n", array[idx]);
3.分配最小内存量
每次我们需要存储另一个整数时,我们将数组的大小增加 1。这样可以节省空间,但速度不是很快。
int *array = NULL;
size_t size = 0;
int n;
while (scanf("%d%*d", &n) != EOF)
{
array = realloc(array, ++size * sizeof *array);
array[size - 1] = n;
}
for (size_t idx = 0; idx < size; ++idx)
printf("%d\n", array[idx]);
free(array);
4.根本不存储数组
注意到输出并不依赖于读取整个数组,我们不妨打印每两个整数中的第一个。如果程序是交互式的(即用户在程序运行时键入整数),这在终端中看起来不会很漂亮,但如果它从stdin 接收输入,则可以正常工作。
int n;
while (scanf("%d%*d", &n) != EOF)
printf("%d\n", n);
对于所有代码,关于使用scanf 和检查realloc 的返回值的常见警告都适用。