nul终止一个int数组

时间:2010-06-08 15:52:29

标签: c

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++);
    }
}

4 个答案:

答案 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将不会被视为整数数组的终结符,并且整个数组都会被打印出来。