| Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
| Форум программистов > C/C++: Общие вопросы > Как объяснить исключение при простом присваивании |
| Автор: Royan 2.7.2004, 21:48 | ||
Вот мой код:
Переменная szStr приходит из WinMain (это lpCmdStr). На самом деле в том месте где происходит присваивание, *szTemp точно содержит пробел, то есть * не разывеновывает указатель на не проинициализированную область памяти, соответственно и присваивание тоже законно, но по какой-то причине именно в этом месте вылетает исключение |
| Автор: Nimbus 4.7.2004, 15:41 | ||||||||
IMHO, видимо, проблема заключается вот в этой строке:
Объясняю, почему: в строке
была выделена память в области динамического обмена, указатель szTemp содержит теперь АДРЕС начала выделенной области памяти. Затем, в строке
этому указателю присваивается адрес хр$н знает какой области памяти, которая, кстати, может быть УЖЕ использована для других целей! ...и затем, в эту хр$н знает какую область памяти, ты записываешь в строке
символ окончания строки '\0' !!! По твоему, это корректно??? |
| Автор: p0s0l 4.7.2004, 18:05 | ||||
Только не понятно - зачем там было создавать и копировать строку ?... Задумка не совсем ясна - надо обрезать исходную строку или же обрезать скопированную строку ? У меня такой код обрезает справа пробелы в szStr нормально, без ошибок:
PS: есть функция StrTrim... |
| Автор: Nimbus 4.7.2004, 23:55 | ||
Признаю, насчет
ПОГОРЯЧИЛСЯ, но постойте, куда же девался post от mr.DUDA (так, кажется, его зовут?) |
| Автор: Олег М 5.7.2004, 10:50 | ||||
| [quote]LPSTR CMyDoc::mMyTrim(LPSTR szStr){ //MessageBox(NULL, szStr, "", MB_OK); size_t nStrLen = 0; StringCchLength(szStr, 4096, &nStrLen); LPSTR szTemp = new CHAR[nStrLen+1]; StringCchCopy(szTemp, nStrLen, szStr); szTemp = szStr + nStrLen -1; // First trim spaces on the right while( (szTemp >= szStr) && (*szTemp == ' ') ) *szTemp = '\0';//Здесь и возникает ошибка Какой-то хитровыдуманный способ. Но впринципе дожно работать. Только здесь надо
и можно попрощаться с началом строки - хрен потом найдёшь. Ну да ладно. И проверять надо, чтоб nStrLen!=0. И чтоб строка из одних пробелов не состояла - то начало-то потеряялось. И цикл чуть-чуть переделать
Атак всё круто. Иногда даже будет работать |
| Автор: AndyY 5.7.2004, 11:48 |
| думаю действительно lpCmdStr лежит на страничке с атрибутами PAGE_READONLY и при попытке ее модифицировать и происходит exception. надо не так: szTemp = szStr + nStrLen -1; а так: szTemp = szTemp + nStrLen -1; только начало строки действительно теряем |
| Автор: Royan 5.7.2004, 15:28 | ||
| 2Nimbus Твоя мысль ясна и поэтому я несколько переделал алгоритм, дабы избавиться от подобных недорозумений, и хоть он получился несколько плосковатым, зато по-мойму стал более безопасным 2p0s0l Ради одной функции StrTrim подрубать библу слишком жирно 2Олег М Насчет nStrLen!=0 согласен, но менять условия цикла я не стал, так как есть вероятность того что байт перед 0-м символом строки тоже окажется пробелом и тогда будем считать левые пробелы лежащие где - то там... 2AndyY
Не думаю, я в одном случае получаю строчку из "Configuration Properties > Debugging > Command Arguments" проекта, а второй раз из самой командной строки, а результат один и тот же. |
| Автор: Nimbus 6.7.2004, 00:07 | ||||
И что, это работает?!
А где же тип переменной szTemp? ...хотя, если она была уже объявлена где-то... И вот это ещё:
В данном случае, IMHO, переменная nLastPos ВСЕГДА будет равна 0 (что-то я не просёк, где nStrLen присваивается хоть что-то после инициализации нулём). Но, как я подозреваю, задумка была совсем иной! Остальное проверю завтра, а то поздно уже... |
| Автор: Nimbus 6.7.2004, 00:10 |
| ...да, похоже на сервере со временем что-то (на моих часах 01:11)??? |
| Автор: Nimbus 6.7.2004, 00:12 |
| ...да, похоже на сервере со временем что-то (на моих часах 01:11)??? |
| Автор: Олег М 6.7.2004, 08:47 | ||
Да уж, точно - изобрёл. Велосипед с треугольными колёсами. Ты её хоть скомпилировал? О запуске речи пока и не идёт |
| Автор: Royan 6.7.2004, 14:44 | ||
Прошу прощения вот правильный вариант (то что выше писалось на работе из головы поэтому и наделал ошибок)
|
| Автор: Олег М 6.7.2004, 15:11 | ||
| Нормально только надо {if(nLastPos == 0) { return ""; } как вариант (тоже из головы) - почти тоже самое
|