2016-07-11 4 views
75

Когда я прочитал BlueZ исходный код, я часто вижу char массивы, определенные как это:Зачем определять 0 как первый элемент массива char в C?

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

Что хорошего в том, чтобы определить первый элемент в качестве \0?

+23

Он эффективно скрывает строку от печати или копирования со стандартными функциями - каково бы ни было намерение. – tofro

+0

В 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

ответ

116

В вашем конкретном случае этот массив используется как путь для сокета PF_LOCAL; см. here. И ведущий NUL используется, чтобы указать, что адрес является абстрактным. От man 7 unix:

абстрактный адрес сокета отличается тем, что sun_path [0] является нулевыми байтами ('\ 0').

И это единственная причина, по которой первый элемент - \0.

+9

Можете также процитировать это для потомков: «[абстрактное пространство имен w], представленное в Linux 2.2, и не должно использоваться в переносных программах». – Kevin

Смежные вопросы