【问题标题】:Array of arrays, with different sizes数组数组,大小不同
【发布时间】:2014-03-30 15:19:11
【问题描述】:

我有一个数组,它在每个单元格中都有数组。比如大数组叫arr

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

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

这是我的代码:

#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])?
  • 有没有不使用 struct 的方法?而sizeof(arr[i])/sizeof(arr[i][0]) 返回 1,当有 5 个元素时...
  • 好吧,那就没办法了。 sizeof(arr[i])/sizeof(arr[i][0]) 如果 arr[i] 是数组而不是指针,则有效。 C 不存储数组大小。所以你最好的选择是使用像struct {int *arr; int size;} 这样的结构并制作一个这样的结构数组。
  • 如果无法避免数组,可以试试这个吗? int a[6] = {&lt;size of array&gt;, 2,3,4,5}

标签: c arrays pointers


【解决方案1】:

问题:

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

【讨论】:

    【解决方案2】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-04-15
      • 2013-06-18
      • 2015-11-25
      • 2021-08-11
      • 1970-01-01
      相关资源
      最近更新 更多