gcc 4.4.4 c89
我刚刚尝试使用int数组。我想到了一些东西。我可以终止它吗?例如,我使用0到nul终止。但是,0可能是此数组中的有效值。
以下代码将在5之后终止。尽管我的意思是0是有效数字。但是,我可以指定数组的大小。但在这种情况下,我不想这样做,因为我只对这个特殊问题感兴趣。
非常感谢任何建议,
#include <stdio.h>
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++);
}
}
答案 0 :(得分:14)
简而言之,没有。技术上,nul字符在字符串中同样有效,它只是我们用它们来标记字符串结尾的约定,并且所有标准库函数都期望这样。对于字符串需要包含\0\0
的情况,有“双nul终止”字符串以\0
结尾,但当然您遇到无法存储\0\0
的问题在字符串中。
如果您不想单独存储数组的大小(或使用像sizeof
这样的技巧),您需要提出一个可以存储在该类型中的标记,但您知道它不会是阵列;您可以使用45
,只要您确定arr
不会将其作为有效值,它只需要是唯一的
答案 1 :(得分:3)
为了使用sentinel值,显然你必须找到一个不是有效数据的值。这是使用哨兵的一个缺点(另一个是找到长度所需的线性搜索)。 0xFFFF
之类的东西对你有用吗?
如果这是C ++,我建议创建一个具有相关长度成员的类(或者更好,只使用std::vector
)。对于C,您可能应该自己保留单独的长度变量。如果你愿意的话,你可以把它想象并把它和数组放在一个结构中。
答案 2 :(得分:3)
简单地说,\ 0与0相同,所以如果你的数组中有一个零,你的代码会把它误认为数组的结尾:
int arr[] = {30, 450, 14, 5, 0, 10, '\0'};
^ this is the end of the array
编辑:请注意,“数组的结尾”是指算法定义的数组的概念结尾,而不是C编程语言在内存中布局的数据的实际范围。
答案 3 :(得分:1)
嗯,您也可以将您的哨兵从\0
更改为\\0
。因此,对while
循环的条件稍作修改就可以解决您的问题。
while(*p != '\\0')
现在,0
将不会被视为整数数组的终结符,并且整个数组都会被打印出来。