为什么在C语言中要将\0定义为char数组的第一个元素?

75

当我阅读BlueZ源代码时,我经常看到像这样定义的char数组:

// bluez/android/sco-msg.h
static const char BLUEZ_SCO_SK_PATH[] = "\0bluez_sco_socket";

将第一个元素定义为\0有什么好处呢?


23
无论意图如何,它都可以有效地隐藏字符串,使其无法通过标准函数进行打印或复制。 - tofro
在Bluez中,这种样式的数组被用于如下代码: struct sockaddr_un addr; memcpy(addr.sun_path, BLUEZ_SCO_SK_PATH, sizeof(BLUEZ_SCO_SK_PATH));套接字路径会是什么样子呢,是/dev/socket/?bluez_sco_socket吗? 或者它无法使用“ls”命令查看? - user1923105
1个回答

116

在您的特定情况下,这个数组被用作 PF_LOCAL socket 的路径名;请参见这里。并且前导 NUL 用于指示该地址是一个抽象地址。来自man 7 unix

抽象套接字地址通过 sun_path[0] 是空字节('\0')来区分。

这也是为什么第一个元素是 \0 的唯一原因。


9
可能也需要引用这句话,以备后人之需:“Linux 2.2 引入了抽象命名空间,不应在可移植程序中使用。” - Kevin

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接