我有一个数组,每个单元格都有数组。例如,大数组称为arr
:
int a[3] = {3, 2, 1};
int b[2] = {2, 1};
int *arr[2] = {a, b}
现在问题是,如果我想在大阵列中打印小arrs。
这是我的代码:
#include <stdio.h>
void printArr(int arr [], int n)
{
for (int i = 0 ; i < n ; i++)
{
printf("%d ", *(arr + i));
}
printf("\n");
}
int main()
{
int a[5] = {1, 8, 4, 2, 0};
int b[3] = {1, 4, 2};
int *arr [2] = {a, b};
int n = 0;
for (int i = 0 ; i < 2 ; i++)
{
printArr(*(arr + i), n);
}
}
输出应该是这样的:
1 8 4 2 0
1 4 2
但是我无法得到每个数组的大小,因为sizeof(*(arr + i)
给了我4,这是指针的大小(数组的名称),而不是它自己的所有数组。
那我该怎么办?
谢谢!
答案 0 :(得分:7)
问题:
C语言只提供了一种查找类型大小的方法。
这给出了将sizeof
应用于:
1)类型如下的数组:
int a[3];
sizeof(a); // => 3 * sizeof(int)
2)指向类型的指针:
int *ptr;
sizeof(ptr); // => sizeof(int *)
或
int a[3] = {3, 2, 1};
int b[2] = {2, 1};
int *arr[2] = {a, b};
sizeof(arr[1]); // => sizeof(int *)
某些解决方案:
存储尺寸
因为jfly建议存储数组的大小。
附加结束标记
添加用于c样式字符串的结束标记,如'\0'
。
在这种情况下,您可以使用INT_MAX
或INT_MIN
。
printArr
实施需要更改为:
void printArr(int *arr)
{
int *it = arr;
while(arr != INT_MIN);
{
printf("%d ", *it);
}
printf("\n");
}
缺点:
优点:
使用迭代器
将指针存储到第一个值,将指针存储在最后一个值之后。
void printArr(int *begin, int *end)
{
for (int *it = begin; it != end; it++)
{
printf("%d ", *it);
}
printf("\n");
}
int *end_arr[2] = {a + 3, b + 2};
for (int i = 0 ; i < 2 ; i++)
{
printArr(arr[i], end_arr[i]);
}
答案 1 :(得分:1)
由于arr
是一个指针数组,因此您无法从指向数组的指针获取数组的大小,您需要额外的大小信息:
int size_arr[2] = {sizeof(a) / sizeof(int), sizeof(b) / sizeof(int)};
for (int i = 0 ; i < 2 ; i++)
{
printArr(arr[i], size_arr[i]);
}