nul终止一个int数组

gcc 4.4.4 c89

我只是在试验一个int数组。 我想到了一些事情。 我可以终止它吗? 例如,我使用0到nul终止。 但是,0可能是此数组中的有效值。

下面的代码将在5之后终止。尽管我的意思是0是有效数字。 但是,我可以指定数组的大小。 但在这种情况下,我不想这样,因为我只对这个特殊问题感兴趣。

非常感谢任何建议,

#include  static void test(int *p); int main(void) { int arr[] = {30, 450, 14, 5, 0, 10, '\0'}; test(arr); return 0; } static void test(int *p) { while(*p) { printf("Array values [ %d ]\n", *p++); } } 

总之,没有。 技术上,nul字符在字符串中同样有效,它只是我们使用它们来标记字符串结尾的约定,并且所有标准库函数都期望这样。 对于字符串需要包含\0\0的情况,有“双nul终止”字符串以\0\0结尾,但是当然你会遇到无法在字符串中存储\0\0的问题。

如果您不想单独存储数组的大小(或使用像sizeof这样的sizeof ),您需要提出一个可以存储在该类型中的标记,但您知道它不会成为数组的一部分; 你可以使用45 ,只要你确定arr不会将它作为有效值,它只需要是唯一的

为了使用sentinel值,显然你必须找到一个不是有效数据的值。 这是使用哨兵的一个缺点(另一个是找到长度所需的线性搜索)。 0xFFFF东西对你0xFFFF吗?

如果这是C ++,我建议创建一个具有相关长度成员的类(或者更好,只使用std::vector )。 对于C,您可能应该自己保留单独的长度变量。 如果你愿意的话,你可以把它想象并把它和数组放在一个结构中。

简单地说,\ 0与0相同,所以如果你的数组中有一个零,你的代码会把它误认为是数组的结尾:

 int arr[] = {30, 450, 14, 5, 0, 10, '\0'}; ^ this is the end of the array 

编辑:请注意,“数组末尾”是指算法定义的数组的概念结束,而不是C编程语言在内存中布局的数据的实际范围。

那么,你也可以将你的哨兵从\0更改为\\0 。 因此,稍微修改while循环的条件将解决您的问题。

 while(*p != '\\0') 

现在, 0将不被视为整数数组的终止符,并且整个数组被打印。