【问题标题】:How to know the end of int* array?如何知道 int* 数组的结尾?
【发布时间】:2012-04-30 11:57:20
【问题描述】:

我正在使用malloc() 创建一个具有int* 数据类型的动态数组。但问题是,如何知道数组的结尾?

对于int* 数据类型,没有与\0 等效的对象,那么,该怎么做呢?将大小作为函数的输出参数传递?

【问题讨论】:

  • 您正在使用 malloc() glob 一些内存,例如 malloc(sizeof(int) * ELEMENTS) 我想。然后你实际上知道 ELEMENTS 的大小,你可以保存变量并将其传递给你的函数。

标签: c arrays int


【解决方案1】:

C 不像其他一些语言那样管理数组长度。

你可以考虑这样的结构:

typedef struct t_thing {
  int* things;
  size_t count;
} t_thing;

使用中:

t_thing t = { (int*)malloc(sizeof(int) * n), n };

【讨论】:

    【解决方案2】:

    对于整数没有等效于\0 的“官方”值,但您当然可以使用自己的值。例如,如果您的整数表示距离,那么您可以使用 -1(不是有效距离)作为标记值来指示数组的结尾。

    如果您的整数数组可以合理地包含 任何 int 值,那么您可以将分配数组的大小与附加参数一起传回给您的函数。

    【讨论】:

    • 我喜欢你的想法。我也会使用#define EON EOF
    【解决方案3】:

    您可以使用NULL 作为结束值。您可以使用跟踪条目数的数组将整数添加到结构中。或者您可以单独跟踪尺寸。你可以随心所欲。

    【讨论】:

    • 如何使用 NULL 作为 int[] 的最终值?字节 00 00 00 00 将被解释为 (int)0。
    • 没错。如果数组中没有其他值包含 0,则可以使用 0 作为终止符。
    • 如果没有其他值包含 42,则可以使用 42。答案至少对我来说意味着 int 在某种程度上是可空类型,当然不是。
    • 对于它是int * 值的动态数组还是int * 指向的整数值的动态数组,OP 模棱两可。使用NULL 作为标记假定它是一个指针数组。如果不是,您可以对不能在数组内使用的类型使用任何合法的值。如果数组中没有不合法的值,则需要使用另一种机制。
    【解决方案4】:

    C 不知道动态数组的末尾在哪里。您应该记住为数组分配的大小。

    【讨论】:

      【解决方案5】:

      当您使用 malloc 分配内存时,分配的字节数存储在“malloc”内存开始之前。如果你知道大小,你也知道结束! 这在 K&R 书籍 C 的圣经中有解释。希望我也可以给你页码,但是当你看到它时你就会知道。

      【讨论】:

        猜你喜欢
        • 2016-02-03
        • 2014-09-18
        • 1970-01-01
        • 1970-01-01
        • 2014-04-03
        • 2012-06-24
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多