【问题标题】:Having trouble finding the length of an array in C? [duplicate]在 C 中查找数组的长度时遇到问题? [复制]
【发布时间】:2012-12-11 03:38:09
【问题描述】:

可能重复:
c dynamic memory allocation and sizeof()

我试图通过保留一个 16 MiB 的大块并尝试每次访问不同的元素来查找时间来查找缓存块。我只是不能写数组的长度。 如何编写一个 for 循环来遍历数组。我需要数组的长度;我怎么能找到那个?我试过sizeof(a)/sizeof(a[0]),但这不起作用,或者我做错了什么,因为我的作业表告诉我它可以容纳400万int的..

register *a;
a = malloc(16777216);
int i;
for (i = 0; i < sizeof(a)/sizeof(a[0]); i = i + 1) {

    printf("\ni = %d", i);
}

这只会打印 i = 0 i = 1。

【问题讨论】:

  • 您需要使用更现代的编译器或打开一些警告。符号register *a 是过时的(20 多年来一直不鼓励使用)register int *a 的书写方式。这很有趣;要编译 int i;,您必须使用 C++ 或 C99 编译器,因为在 C89 中的语句之后不允许声明。注意你的编译器警告你什么(如果它没有警告你,打开警告或获得更好的编译器)。您必须使用 64 位计算机才能获得 0, 1 答案。

标签: c arrays


【解决方案1】:

代码sizeof(a)只是返回指针register *a的大小,与a指向的数组大小完全无关。

C 数组不跟踪它们包含多少项。只有在编译时知道数组的大小时,才能使用此语法。但是你不能用这种方式分配的数组来做到这一点。

对于此任务,您需要自己跟踪此信息。您可以将该值存储在一个变量中,或者您可以附加一个带有特殊值的数组元素,该值表明它是数组的末尾(就像我们对 C 字符串所做的那样)。

【讨论】:

  • “C 数组不跟踪它们包含多少项”......严格来说这不是真的。如果您在实际数组类型上使用sizeof,它将为您提供数组的大小(以字节为单位)。在这里,OP 使用的是指针类型的sizeof,而不是数组类型,所以它只给他指针的大小。 sizeof("hello") 例如返回 6,因为字符串文字 "hello" 的类型为 char[6]
  • sizeof 也适用于可变长度数组,这意味着数组的大小必须保留在某个位置,以便sizeof 返回可变长度数组的正确大小。跨度>
  • 我确实明确指出,如果数组是静态声明的,它就可以工作。他可能正在使用指针,但从概念上讲,他正在分配一个数组。而且那个动态分配的数组不会跟踪元素的数量。
  • @dreamlax:我很想看到sizeof() 与可变长度数组一起使用的示例。
  • 考虑一个具有数组类型成员的结构 (struct X { int a[4]; }。该结构可以动态分配,因此数组类型成员也必须动态分配;sizeof 仍将返回数组类型成员 a 的正确大小。这不是对象的“分配”方式,而是对象的类型
【解决方案2】:

a 是寄存器指针而不是数组。因此 sizeof(a) 不会像您期望的那样返回 16MB。请直接使用 16777216 代替 sizeof()

【讨论】:

  • 这就是数组的长度..
  • @user1893417: 是的 16777216 将是您的数组的长度
猜你喜欢
  • 2019-12-20
  • 2021-04-23
  • 1970-01-01
  • 1970-01-01
  • 2022-06-17
  • 1970-01-01
  • 1970-01-01
  • 2015-02-22
  • 1970-01-01
相关资源
最近更新 更多