arrays数组,大小不同

我有一个数组,每个单元格都有数组。 例如,大数组称为arr

 int a[3] = {3, 2, 1}; int b[2] = {2, 1}; int *arr[2] = {a, b} 

现在问题是,如果我想在大arrays内打印小arrs。

这是我的代码:

 #include  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,这是指针的大小(数组的名称),而不是它自己的所有数组。那么什么我可不可以做?

谢谢!

问题:

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建议存储数组的大小。

  • 使查找大小成为恒定时间操作。

附加结束标记

添加像'\0'这样的结束标记,用于c风格的字符串。 在这种情况下,您可以使用INT_MAXINT_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]); } 
  • 可以扩展到其他数据结构。

由于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]); }