Это я, здравствуйте. http://the-epic-file.com/bookshelf.htm
-
- str - указатель (т.е. переменная для хранения адреса), в ней мусор,
т.к. ничего разумного в нее не успели положить. Тогда как tmp_line
- это уже реальный блок памяти длиной MAXLINE, куда можно что-то
писать. Kceния(1250 знак., 21.06.2021 11:19 - 14:10)
- Особая печаль ситуации в том, что я пробовал без звёздочки и
получал тот же "Access violation". А дело-то было в
неинициализированном указателе. - teap0t(21.06.2021 12:04)
- Об этом я уже вас предупреждала - в str у вас лежит мусор, а ошибка
"Access violation" типична при обращении по мусорному адресу. - Kceния(21.06.2021 14:13)
- Ну да. Ваши объяснения позволили ретроспективно разделить две разные ошибки с одинаковой диагностикой. - teap0t(21.06.2021 18:02)
- Кстати, современный GCC заметно прибавляет в части диагностики.
Иногда откровенно удивляет (в положительном ключе). Не удивлюсь,
если на этот код он скажет "звёздочку убери". Короче, VC6 на свалку
истории, современный GCC более лучше. - SciFi(21.06.2021 12:11)
- Да, перейдя с ГЦЦ 5.4 на 10.2, был сильно удивлен качеством подсказок. Хотя выхлоп не сильно изменился, на пару процентов меньше стал. - Andreas(21.06.2021 12:57)
- У меня последние полгода один сплошной цейтнот. Погожу пока компайлер менять. [Картинка про тачку с квадратными колёсами]. - teap0t(21.06.2021 12:15)
- Об этом я уже вас предупреждала - в str у вас лежит мусор, а ошибка
"Access violation" типична при обращении по мусорному адресу. - Kceния(21.06.2021 14:13)
- Особая печаль ситуации в том, что я пробовал без звёздочки и
получал тот же "Access violation". А дело-то было в
неинициализированном указателе. - teap0t(21.06.2021 12:04)
- Логичнее тогда уж sprintf(&str, "%.4f", 0 ); и это тоже будет
работать правильно, хотя и компилятор варнинг даст, ибо вместо
указателя на абстрактную строку дается указатель на строку
конкретной длинны. - Andreas(21.06.2021 12:54)
- &str — это адрес указателя. Ужас-ужас. - SciFi(21.06.2021 12:57)
- Это адрес массива и это работает, как ни странно. Где-то в
стандарте это видел, но наизусть его не помню, в отличие от. - Andreas(21.06.2021 13:01)
- См. код в корне ветки. Адрес массива — это &tmp_line. Адрес
указателя — это &str. SciFi(81 знак., 21.06.2021 13:07)
- Точно, после длинных выхов надо восстанавливаться. - Andreas(21.06.2021 13:07)
- Это работает, если писать &str[n]. Адрес "n"-ного элемента массива. - Гyдвин(21.06.2021 13:06)
- См. код в корне ветки. Адрес массива — это &tmp_line. Адрес
указателя — это &str. SciFi(81 знак., 21.06.2021 13:07)
- Это адрес массива и это работает, как ни странно. Где-то в
стандарте это видел, но наизусть его не помню, в отличие от. - Andreas(21.06.2021 13:01)
- &str — это адрес указателя. Ужас-ужас. - SciFi(21.06.2021 12:57)
- Вообще вам еще компилятор должен был сказать что что-то идет не
так. Похоже компилятору сильно урезана диагностика ошибок
(ключами). Надо включить всю диагностику, тогда до исключения будет
реже доходить. И будет понятнее что не так. - AlexBi(21.06.2021 12:05)
- Я уже сталкивался с этой ошибкой в IAR&STM32, но там отчего-то справился самостоятельно. А тут затупил. - teap0t(21.06.2021 12:11)
- Благодарю. Я не то чтобы понял, но без звёздочки заработало. Люблю
Си. Не удивлюсь, если выяснится, что Керниган и Ричи любят кошек и
вообще извращенцы. Win10 - отдельный восторг души. Абсолютно всё в
ней для меня неинтуитивно. Один сплошной вебинтерфейс банка ВТБ.
Плачу, короче, кровавыми слезами. VS6.0 ставиться отказалась. Зато
DevStudio97 встала спокойно. Вечный бой, покой нам только снится...
Зато есть повод для общения. Надеюсь, я вас не слишком утомляю. - teap0t(21.06.2021 11:41)
- Еще раз, вы передали не указатель, а байты, лежащие по записанному в нем адресу ("звездочка" именно команда "взять по адресу" и есть. дословно. во всех без исключения учебниках описано) - Cкpипaч(21.06.2021 12:11)
- Не утомляешь, а просто даришь чистую радость ;) - VLLV(21.06.2021 11:50)
- Кругом одне наркоманы. - teap0t(21.06.2021 12:04)
- Пояснение evgeniy1294(418 знак., 21.06.2021 11:49)
- Поправочка. В функцию передаётся указатель. Обычно указатель на
массив, конечно, но можно придумать и вырожденный случай: char c;
sprintf(&c, ""); - SciFi(21.06.2021 11:53)
- Я писал про конкретную строку - evgeniy1294(21.06.2021 12:18)
- Поправочка. В функцию передаётся указатель. Обычно указатель на
массив, конечно, но можно придумать и вырожденный случай: char c;
sprintf(&c, ""); - SciFi(21.06.2021 11:53)
- Вступлюсь за пророков Кернигана и Ричи. Всё у них хорошо написано, не надо искажать Истинное Учение. Просто нужно всегда знать тип каждого выражения, которое встречается в коде. Иначе будет вуду, чорная магия и загадочные баги. - SciFi(21.06.2021 10:39)
- Вы вместо указателя передали несколько первых байт из массива str. Первый параметр sprintf - указатель. Имя массива - указатель. А вот второй вариант - нет. - Cкpипaч(21.06.2021 10:27)
- Звездочку убери. il-2(36 знак., 21.06.2021 10:12)
- str - указатель (т.е. переменная для хранения адреса), в ней мусор,
т.к. ничего разумного в нее не успели положить. Тогда как tmp_line
- это уже реальный блок памяти длиной MAXLINE, куда можно что-то
писать. Kceния(1250 знак., 21.06.2021 11:19 - 14:10)