• 15 апреля стартует «Курс «SQL-injection Master» ©» от команды The Codeby

    За 3 месяца вы пройдете путь от начальных навыков работы с SQL-запросами к базам данных до продвинутых техник. Научитесь находить уязвимости связанные с базами данных, и внедрять произвольный SQL-код в уязвимые приложения.

    На последнюю неделю приходится экзамен, где нужно будет показать свои навыки, взломав ряд уязвимых учебных сайтов, и добыть флаги. Успешно сдавшие экзамен получат сертификат.

    Запись на курс до 25 апреля. Получить промодоступ ...

Не присваивается значение элементу массива Lpwstr

  • Автор темы Tolias
  • Дата начала
T

Tolias

Есть кусок кода некоторой программы на C++

Код:
	LPWSTR dir;
GetModuleFileName(NULL, dir, 300);
//dir[3]='!';
int i, j=0;
for(i=0;dir[i]!='\0';i++)
if(dir[i]=='\\')
j=i;
dir[j]='\0';
j++;

Пишу в Visual Studio 2010.
Вопрос такой: Почему строка dir[j]='\0'; игнорируется и не выполняется как будто в коде ее вообще нет?
Вот поставил я брекпоинты на всех строках этого кода, запустил, и брекпоинт со строки "dir[j]='\0';" исчезает! И когда программа выполняется, то эту строку вообще пропускает, как будто там ничего нет.

В коде, что я привел выше, вы видите третью строку закоментированной. Если ее раскоментировать, то эта строчка выполнится без проблем. Но как только ее поместить ниже цикла, так тут же она игнорируется! :confused:
Я вообще не въежаю, как объяснить такое странное поведение?? Объясните пожалуйста, а то у меня от этого странного поведения уже мозг кипит.


P.S. Сама задача этого кода в следующем: получить полный путь к текущей программе и отбросить в пути имя программы, оставив таким образом только путь к папке программы.
 
L

lazybiz

Ты думаешь память для dir функция выделит? Меняй на wchar_t dir[300];

Добавлено: Да еще, ты с Unicode работаешь? Если да то ты не можешь сравнивать элемента массива в стиле if(dir=='\\') и т.п.
 
T

Tolias

Признаюсь, я в самом начале память под dir выделял, но тогда компилятор ругался на невозможность преобразования:
IntelliSense: argument of type "LPWSTR *" is incompatible with parameter of type "LPWSTR"
потому я искусился объявить просто указатель, довольствовашись тем, что компилятор молча компилирует и не ругается.

Спасибо за работающий пример) Но я все же более посматриваю на свой алгоритм, так как он по идее должен быть быстрее. Там не подсчитывается длина массива(а это уже нету лишнего прохода по массиву). Проход осуществляется лишь один раз в цикле, где там же вычисляется последний слеш.

Upd:
Выделил память под dir, но строка dir[j]='\0'; всеравно не исполняется(( Почему?
 
T

Tolias

А проблема то оказалась в том, что я все эти отладки и правки кода делал в релиз, а не в дебаг! Элементарно то как... Никогда не думал, что при отладке в релизе могут быть такие приколы. Теперь буду знать.
 
L

lazybiz

Upd:
Выделил память под dir, но строка dir[j]='\0'; всеравно не исполняется(( Почему?
Потому что это Unicode.

А проблема то оказалась в том, что я все эти отладки и правки кода делал в релиз, а не в дебаг! Элементарно то как... Никогда не думал, что при отладке в релизе могут быть такие приколы. Теперь буду знать.
Ой как ты заблуждаешься........
 
T

Tolias

ага, только тогда получается Visual Studio тоже заблуждается :ya_lamo:
 
L

lazybiz

Ты зря улыбаешься. Ты вообще в курсе что в Unicode один символ имеет размер два байта? А ты пишешь то, что по определению работать не должно.
Например это - for(i=0;dir!='\0';i++) для строки Unicode недопустимо.
Желаю удачи :ya_lamo:
 
A

a0z

Потому что это Unicode.

Ну-ну. Компилятор её просто выкинул, потому что она "не правильная". Новое слово в компиляторописании :))
Более того, он вполне себе правильная - char кастится до wchar_t. Для символов ASCII это будет правильно.

Скорее всего компилятор выбросил dir[j]='\0', поскольку dir больше нигде не используется. У меня правда это не повторяется, видимо другое окружение кода, зато выбрасывает последнюю строку j++.
 
A

a0z

Если прочитать предложение полностью, то оно становится вполне понятным:

Скорее всего компилятор выбросил dir[j]='\0', поскольку dir больше нигде не используется.

Выделеное - ответ на вопрос, почему на эту строку не попадает дебагер и не может поставить бряку.
 
Мы в соцсетях:

Обучение наступательной кибербезопасности в игровой форме. Начать игру!