sizeof()求的是数组占用空间的尺寸(以字节为单位),但不能求出数组有效数据使用了多少空间。比如,定义char str[n]后,用sizeof(str)永远得到n,这是不需要程序运行就由编译器在编译时计算得到的;假如是int x[n],sizeof(x)得到的是n * sizeof(int),因为每个元素int占用的空间是sizeof(int)字节,用sizeof(x) / sizeof(int),也同样得到n。这些运算,都得不到有效数据到底到哪为止,就如尽管是str[n],但str字符串可能是空串,这个数组占用的空间是nByte,不过有效数据只是str[0] = '\0',即只有一个元素。换句话说,用strlen(str)才能知道str在哪里结束,不能用sizeof(str) / sizeof(char)来算。同样,对任何的指针型数组,也无法通过那种方法知道数据到哪个元素为止。唯一的办法,是与字符串一样,约定某个特殊标志,比如字符串约定是'\0',那么你也可以约定是NULL指针,遇到NULL指针就算是有效数据到此为止。这个问题,早几天有人讨论过,那些解决办法也是错的,原因就在这里说明,不重复。
C语言往往通过遍历数组寻找终止符来确定结束位置,但其实可以仿用BASIC数组的方法来处理:将数组第0个元素的值写入为有效元素个数,数据从序号1开始,这样就不用遍历,读一下x[0]就知道数组到底有多少个有效元素了。C的类似解决方法,是另外传递一个参数,亦即常见的count计数器表示数组的有效数据个数,这就是标准库中很多涉及数组的函数都带有计数器参数的原因,特别是新增的安全型函数,全部都是靠这种参数来加强检测越界的。
最难搞的是int型数组,是没有可能约定结束标志的,因为整数零恰恰可能是有效数据!解决办法只能是上面所说的两种。
_countof()其实就是数人头,是sizeof(x) / sizeof(int)的性质,同样是算不出有效个数的。
[
本帖最后由 TonyDeng 于 2012-12-23 04:59 编辑 ]