ВходНаше всё Теги codebook 无线电组件 Поиск Опросы Закон Понедельник
21 апреля
414292 Топик полностью
amx (31.05.2013 17:35 - 18:14, просмотров: 250) ответил Молодой коллега на char* pText = "Main Menu1"; "Main Menu1" компилятор должен положить строку в озу или во флеш?
Строковые литералы имеют тип const char*. Для МК с одним адресным пространством всё const идёт в ПЗУ, а у AVR/PIC, например, что бы строка была в ПЗУ надо дописать волшебное слово PROGMEM/rom. Иного можно добиться шаманством со скриптами линкера. pText в ОЗУ и указывает на ПЗУ, pText2 - массив в ОЗУ который инициализируется значением из ПЗУ. Для strtok строка должна быть в ОЗУ, т.к. для разбивки на токены строку надо изменять (вместо разделительных символов подставлять '\0'). вообще pText должен бытьconst char* pText = "...";Тогда компилятор бы вас до HardFault-a не допустил бы, кричал бы о "passing argument 1 of 'strtok' discards 'const' qualifier from pointer target type" и "note: expected 'char *' but argument is of type 'const char *'" или похожем. P.S. прошерстил стандарт и не нашёл подтверждения своих утверждений :( То есть строковый литерал имеет тип char[], по этому вариант char *pText = "..." не выдаёт предупреждений. Но есть одно но: ISO/IEC 9899 Annex J.2 Undefined behavior: "The program attempts to modify a string literal (6.4.5)."