获取数组的长度

时间:2015-05-23 12:47:06

标签: c arrays pointers sizeof

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

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

适用于定义为:

的数组
type arr[];

但不适用于以下内容:

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

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

4 个答案:

答案 0 :(得分:2)

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

所以如果你有这样的陈述

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

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

答案 1 :(得分:1)

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

详细说明,

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

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

请记住, string 的定义是以空字符结尾的字符数组。

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

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

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

答案 2 :(得分:0)

  

删除演员。你不应该转换malloc和的结果   家族。

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

在C中的

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

在调试期间和维护期间,通常会更改接收指针类型。这种变化的起源通常不是调用malloc函数的地方。如果返回的值是强制转换的,则会向代码引入错误。这种bug很难找到。

答案 3 :(得分:0)

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

您需要使用其他一些数据结构来保存本书,以确保每次都能获得正确的结果。