多个不同大小的数组组成的数组

7

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

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

现在的问题是,如果我想要打印大数组里的小数组。

这是我的代码:

#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,这是指针(数组名称)的大小,而不是整个数组本身的大小。 那么我该怎么办呢?
谢谢!

为什么不使用一个可以存储数组大小的结构体,并创建这样的结构体数组呢? 顺便说一下,尝试使用 sizeof(arr[i])/sizeof(arr[i][0]) - avmohan
有没有不使用结构体的方法? 当有5个元素时,sizeof(arr[i])/sizeof(arr[i][0])返回1... - Amit
1
那么就没有办法了。如果arr[i]是数组而不是指针,则sizeof(arr[i])/sizeof(arr[i][0])可行。 C语言不存储数组大小。因此,最好的办法是使用结构体,例如struct {int *arr; int size;},并创建这样结构体的数组。 - avmohan
1
可能会有用:https://dev59.com/pnM_5IYBdhLWcg3wq1CF - Sami Korhonen
1
如果你无法避免使用数组,你可以尝试这个方法吗?int a[6] = {<数组大小>, 2,3,4,5} - cppcoder
显示剩余2条评论
2个回答

8

问题:

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

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接