2011-07-18 29 views
1

我正在ANSI C中使用很多固定长度的数组。与其为每个数组设置数组长度变量,似乎更容易在数组末尾添加“NULL”终结符,这与字符串类似。 Fot我当前的应用程序我正在使用“999999”,这将永远不会发生在实际的阵列。我可以通过查找终止符来执行循环并确定数组长度。这是一种常用的方法吗?它有什么问题?谢谢。可以使用终结器来管理固定长度的数组吗?

+2

出了什么问题'的sizeof(my_array)/的sizeof(my_array_type) '? –

+1

@Ed:sizeof(my_array)/ sizeof(* my_array)'给出了数组的大小(容量),而不是根据程序逻辑使用的实际元素。 –

+0

如果你使用固定长度的数组,那你为什么需要终止它们?终结者用于可变长度的字符串/数组。如果他们实际上是可变长度的,那么@yan在下面有正确的答案。 – unpythonic

回答

1

我能想到的主要问题是跟踪长度可能很有用,因为在C中的函数中建立了以长度作为参数的函数,并且您需要知道长度以知道在哪里添加下一个元素。

在现实中,它取决于你的数组的大小,如果它是一个巨大的数组,比你应该跟踪的长度。否则循环通过它来确定每次你想添加一个元素到最后的长度将是非常昂贵的。 O(n)而不是O(1)的时间,你通常得到与阵列

1

这种方法的主要问题是,如果您只想确定长度,您无法预先知道长度而不循环到数组的末尾 - 并且会对性能产生很大的负面影响。

2

您的main参数在技术上使用此方法,其中最后一个值是终端NULL,但它也伴随着一个告诉您大小的argc

只使用终端听起来像是在将来更容易出错。将大小和数组一起存储有什么问题?

喜欢的东西:

struct fixed_array { 
    unsigned long len; 
    int arr[]; 
}; 

这也将是更有效和更容易出错。

0

你为什么不只是

  1. const int以后可以使用代码来检查大小,或
  2. 使用int len = sizeof(my_array)/sizeof(the_type)初始化。
+0

使用'size_t'而不是'int'。 –

+0

我的大部分数组都是二维的,所以size_t length = sizeof(myArray)/ sizeof(type)给了我整个数组中元素的数量。我需要每行中的元素数量。如何做到这一点? – MonkeyBusiness

+0

@MonkeyBusiness,把这个关键的细节添加到问题中! –

0

由于您使用二维数组来保存一个衣衫褴褛的数组,您可以使用一个不齐的数组:type *my_array[];。或者你可以把长度放在每行的元素0中,并将这些行视为1索引数组。随着一些邪恶的欺骗,你甚至可以把长度在每行的元素-1 [1]

  1. 左锻炼;!)
相关问题