command
является указателем на char
.
Инициализируется строковой константой, что означает, что это указатель на первый символ этой строки, то есть 'd'
.
Если вы разыменования указателя на char
, вы получите в результате, единственный char
, к которой он указывает, так *command
вычисляет 'd'
.
Вы инициализируете структуру, которая является «совокупным типом» в C, а второй элемент этой структуры представляет собой массив, который также является «совокупным типом».
C90 говорит, в разделе 6.5.7 «Инициализация»
В противном случае инициализатор для объекта, который имеет совокупный тип должна быть скобкой огороженного списка инициализаторов для членов совокупности, написанный в увеличение индекса или порядка членов; и инициализатор для объекта, который имеет тип объединения, должен быть инициализатором, заключенным в скобки для первого члена объединения.
Если совокупность содержит элементы, которые являются агрегатами или объединениями, или если первый член союза является агрегатом или объединением, правила применяются рекурсивно к подгруппам или объединенным объединениям. Если инициализатор субагрегата или объединенного объединения начинается с левой скобки, инициализаторы, заключенные в эту скобку, и ее подходящую правую фигуру инициализируют членов субагрегата или первого члена объединенного объединения.В противном случае только достаточное количество инициализаторов из списка учитывается для членов субагрегата или первого члена объединенного союза; любые оставшиеся инициализаторы оставляются для инициализации следующего члена агрегата, частью которого является текущий субагрегат или содержащий объединение.
Ваш инициализатор структуры заключен в скобки, так инициализаторы в этом инициализаторе инициализации членов структуры cmdLength
и cmdRequest
, в порядке, так что инициализирует cmdLength
в cmdlen
и инициализирует cmdRequest
к 'd'
.
cmdRequest
представляет собой агрегат, но его инициализатор не в фигурных скобках, поэтому «только достаточно Инициализаторов из списка принимается для учета членов subaggregate», так cmdRequest[0]
инициализируются 'd'
.
Если вы хотите инициализировать cmdRequest
в массив, первый элемент, на который указывает command
, вы должны сделать это с зЬгсру:
cmdRequest_t cmdRequest;
cmdRequest.cmdLen = (short) cmdLen;
strcpy(cmdRequest.cmdRequest, command);
К сожалению об этом, но это то, что вы получите при использовании язык, в котором строки не являются реальными типами данных ....
'#define COMMAND" d tcpip ", а затем использовать' COMMAND' вместо '* command' – BLUEPIXY
@BLUEPIXY: Это уродливо, и OP может получить строка динамически ... – 3442
@Alex Строковые литералы не нуждаются в явном терминале NULL ('\ 0') - они соответствуют ctly null завершен, если вы этого не сделаете. –