Задать вопрос
herfleisch
@herfleisch

Ошибка в обращении к map через оператор []?

Прошу прощения, вопрос скорее всего совершенно ламерский, но с STL сталкиваюсь впервые.


Есть код:

char* packetType = "SLogin";
RegisteredEventFn fnForCall = registeredEvents[packetType];
// fnForCall == <указатель на функцию>



В таком случае всё работает как часы. А вот так нет:

char* packetType = (char*)txePacket-&gt;Attribute(&quot;type&quot;);
// packetType указывает на строку &quot;SLogin&quot;, строка заканчивается '\0'
RegisteredEventFn fnForCall = registeredEvents[packetType];
// fnForCall == NULL



Почему во втором случае мне возвращается NULL? Ведь в оператор [] и в первом, и во втором случае передаётя указатель на строку. Притом, без разницы, является ли это указатель const char* или char* — эффект всё равно тот же.
  • Вопрос задан
  • 2500 просмотров
Подписаться 2 Оценить 9 комментариев
Решения вопроса 1
@gribozavr
Во втором случае не работает потому что char * сраниваются std::map'ом как указатели. Естественно, две разных строки (одна константа, одна из txePacket), пусть и имея одинаковые значения, находятся по разным адресам и поэтому как указатели не равны.

Остаётся вопрос, почему в первом случае работает. В качестве оптимизации компилятор объединяет все одинаковые строковые константы в одну с одним и тем же адресом в секции только для чтения. Поэтому литеральная строка «foo» в любом месте одной единицы трансляции будет иметь один и тот же адрес.

char *x = "..."; так нельзя. Литеральные строки — это const char *.
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы