【问题标题】:Getting length of an array获取数组的长度
【发布时间】:2015-08-05 10:18:53
【问题描述】:

我一直想知道如何获取数组的元素数。在这个网站的某个地方,我找到了一个答案,告诉我声明以下宏:

#define NELEMS(x) (sizeof(x) / sizeof(x[0]))

它适用于定义为的数组:

type arr[];

但不适用于以下情况:

type *arr = (type) malloc(32*sizeof(type));

在这种情况下它返回 1(它应该返回 32)。 我会很感激一些提示

【问题讨论】:

标签: c arrays pointers sizeof


【解决方案1】:

指针不保存关于它们是指向单个元素还是数组的第一个元素的信息

所以如果你有这样的陈述

type *arr = (type) malloc(32*sizeof(type));

那么这里是arr 不是一个数组。它是一个指向动态分配的内存范围开头的指针。

或者即使你有以下声明

type arr[10];
type *p = arr;

然后指针又不知道它是指向单个对象还是数组的第一个元素。例如,你可以随时写

type obj;
p = &obj;

因此,当您处理指向数组第一个元素的指针时,您必须在某处(在某个其他变量中)保存所引用数组的实际大小。

至于数组本身那么你确实可以使用表达式

sizeof( arr ) / sizeof( *arr )

sizeof( arr ) / sizeof( arr[0] )

但是数组不是指针,尽管它们经常被转换为指向它们的第一个元素的指针,但很少有例外。 sizeof 运算符就是这样的一个例外。 sizeof 运算符中使用的数组不会转换为指向其第一个元素的指针。

【讨论】:

  • 如果指针不知道它所指向的地方的大小,那么free()之类的函数怎么能正常工作呢?
  • @Jytug 函数 free 使用一种内部机制来存储已分配内存的大小(不是元素的数量;malloc 不知道要分配多少数组元素)。该机制是实现定义的,不能作为开放接口访问。
【解决方案2】:

sizeof 运算符产生变量的 type 的大小。它不计算分配给指针(表示数组)的内存量。

详细说明,

  • 如果是type arr[32];sizeof (arr) 本质上是sizeof(type[32])
  • 如果是type *arr;sizeof(arr) 本质上是sizeof(type*)

要获取字符串的长度,需要使用strlen()

记住,string 的定义是一个以 null 结尾的字符数组。


也就是说,在你的代码中,

 type *arr = (type) malloc(32*sizeof(type));

大错特错。为避免此类错误,我们建议do not cast malloc()

【讨论】:

    【解决方案3】:

    然后移除演员表。你不应该转换 malloc 的结果和 家庭。

    这些是不从 malloc(和函数族)转换返回值的主要原因。

    在 C 中,这些函数的返回类型是 'void*'。 void * 可以分配给任何指针类型。

    在调试和维护期间,接收指针类型经常发生变化。这种变化的根源通常不是调用 malloc 函数的地方。如果返回值被强制转换,那么代码中就会引入一个错误。这种错误很难找到。

    【讨论】:

      【解决方案4】:

      在 C 中没有安全可靠的方法来查找数组的长度,因为没有为它们进行簿记。

      您将需要使用其他一些数据结构来为您记账,以确保每次都获得正确的结果。

      【讨论】:

        猜你喜欢
        • 2015-08-14
        • 2013-10-02
        • 1970-01-01
        • 2015-05-11
        • 2011-11-14
        • 1970-01-01
        • 1970-01-01
        • 2013-12-19
        • 2023-04-06
        相关资源
        最近更新 更多