ПочемуC массив инициализации
static char *opcode_str[] = { "DATA"
, "DATA_REQUEST_ACK"
, "ACK_TIMER_EXPIRED"
, "ACK_UNEXPECTED_SEQ"
, "ACK_AS_REQUESTED"
} ;
работы, но
static char **opcode_str = { "DATA"
, "DATA_REQUEST_ACK"
, "ACK_TIMER_EXPIRED"
, "ACK_UNEXPECTED_SEQ"
, "ACK_AS_REQUESTED"
} ;
терпит неудачу с SEGV когда opcode_str [0] printf'd?
Я думаю, это потому, что второй листинг не выделил память для пятиэлементного массива указателей, но мне нужно более полное объяснение.
Всего наилучшего,
Chris.
Спасибо. Почему это не прерывается во время компиляции или когда указатель инициализируется? – fadedbee
@chrisdew это неопределенное поведение, чтобы нарушить семантическое правило в C. Правило, которое вы нарушаете, - это * Инициализатор для скаляра должен быть единственным выражением, необязательно заключенным в фигурные скобки. * У вас есть несколько выражений, заключенных в фигурные скобки. –
Вот и все, я позволю прокрутить предупреждение прямо со своего экрана. Doh! Теперь я вижу, что я устанавливаю указатель char ** на значение указателя char * на «DATA». Затем «DATA» оценивалась так, как если бы эти четыре/восемь байтов содержали указатель, и это вызывало segfault. – fadedbee