【问题标题】:Size of 2d array in cc中二维数组的大小
【发布时间】:2015-02-20 09:24:36
【问题描述】:

我有一个表示为双指针的二维数组- `

   char ** arr;
  arr = (char **) malloc(100 * sizeof(char *));
    for (i=0; i<100; i++)
         arr[i] = (char *) malloc(3 * sizeof(char));

现在我在 arr 中有 100 行和 3 列。但是这个数组在其他地方使用,它填充的行数远少于 100。那么我怎样才能获得大小(填充的行数)才能打印这个数组? ?

【问题讨论】:

  • 它是如何“在其他地方使用”的?它是如何传入的,以及在所述代码中做了什么。
  • 标准警告:请do not castmalloc()和family的返回值。
  • 仅使用此信息..您需要手动填充行数,您可以将变量的地址传递给填充数组并获取填充行数的函数的值跨度>

标签: c


【解决方案1】:

你不能,你将不得不使用一种更具表现力的表示来保存此类元信息。

内存就是内存,没有办法确定它是否被“使用”过,因为一旦你分配了它,它就一直存在。

如果您不能使用标记方法(如 C 字符串,有一个终止符指示有效数据结束),您将不得不使用显式长度值或其他表达这一点的方法。

另外,please don't cast the return value of malloc() in C

此外,不要按sizeof (char) 缩放分配,因为这始终是 1,您只是在添加噪音。很明显,这是我的观点。如果包含乘法,您的代码在技术上永远不会出错,并且有些人清楚地认为它增加了价值并使代码更清晰。

最后,您要进行 100 次堆分配,每次分配 3 个字节,这是非常低效的。我建议只做一个由 100 个 3 字节数组组成的数组(可能表示为 structs 的数组)。

【讨论】:

  • 那么如何打印数组??如果我打印所有 100 行,它会打印垃圾值,因为只有 5 行填充了有效数据
  • @Coder 请阅读我写的内容。您必须添加有关数组中有效元素数量的信息。
  • @Coder 不要打印所有 100 行记录填充的行数,只使用该值来打印行
  • 好的,这是一种方法。但是我不能使用strlen 或其他一些内置方法吗?
  • @Coder 不,因为有问题的数据不是字符串。
【解决方案2】:

我有一个表示为双指针的二维数组

不,你没有。您有一个基于指针的查找表。要动态分配多维数组,请执行something like this。另见How do I correctly set up, access, and free a multidimensional array in C?

但是这个数组在其他地方使用,它填充的行数远远少于 100。那么我怎样才能得到大小(填充的行数)才能打印这个数组???

让您的应用程序跟踪它。没有其他办法。 sizeof 等不起作用,即使您使用正确的数组而不是查找表也是如此。因为sizeof 对数组的内容一无所知。最好和最简单的解决方案是保留一个单独的大小计数器变量。

如果你因为某种原因不能使用这样的尺寸计数器,你可以做一些更复杂的事情。用一些包装 API 包围填充值的代码。然后假设您分配了 101 个项目而不是 100 个项目,并使用第一个或最后一个项目来包含大小。如果使用这种方法,则必须清除所有内存单元,因此在这种情况下最好使用 calloc 而不是 malloc。

如果你需要在中间添加/删除项目,也可以做一个链表实现。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-10-07
    • 2020-06-10
    • 2017-01-05
    • 1970-01-01
    • 1970-01-01
    • 2023-01-25
    • 2020-01-18
    相关资源
    最近更新 更多