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_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]); }
- 可以扩展到其他数据结构。
由于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]); }