![]() |
Модераторы: Daevaorn |
![]() ![]() ![]() |
|
qBiN |
|
||||
Новичок Профиль Группа: Участник Сообщений: 11 Регистрация: 15.12.2005 Репутация: нет Всего: нет |
Вопщем суть,возмем простенькую программу:
Возмем Dev-C++(MinGW) и сишный код компилируется,но не работает(программа вылетает с ошибкой) Поглядел мануалы,там вопще говорят что использовать функцию противопоказана потому что возможно переполнение буфера,но мне на это пофигу,так сказать начинающий. Так вот как сделать что бы sprintf() работал с указателями коректно... ![]()
![]() Помогите пожайлуста =) |
||||
|
|||||
Dov |
|
|||
![]() аСинизатор ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1721 Регистрация: 10.5.2003 Где: Эрец-Исраэль Репутация: 15 Всего: 88 |
А так попробуй, в VC++6.0 работает
-------------------- Тут вечности запах томительный, И свежие фрукты дешевые, А климат у нас – изумительный, И только соседи – #уевые. Игорь Губерман. |
|||
|
||||
DeadSoul |
|
|||
Эксперт ![]() ![]() ![]() Профиль Группа: Участник Сообщений: 1217 Регистрация: 25.9.2005 Где: Москва Репутация: 2 Всего: 11 |
Dov, а память кто освобождать будет?!
Господа, у меня все в порядке с головой? Почему ЭТО компилится? Почему "ad" смогло преобразоватся к char*?! За милую душу сожрали данный код MS VS 6 и MS VS 7.1 -------------------- Если Вы получили ответ на Ваш вопрос, то нажмите на "Вопрос решен". Бьем спамеров их же оружием. Пусть весь спам сыпется им [email protected] |
|||
|
||||
Dov |
|
|||
![]() аСинизатор ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1721 Регистрация: 10.5.2003 Где: Эрец-Исраэль Репутация: 15 Всего: 88 |
Чью память? ![]() -------------------- Тут вечности запах томительный, И свежие фрукты дешевые, А климат у нас – изумительный, И только соседи – #уевые. Игорь Губерман. |
|||
|
||||
DeadSoul |
|
|||
Эксперт ![]() ![]() ![]() Профиль Группа: Участник Сообщений: 1217 Регистрация: 25.9.2005 Где: Москва Репутация: 2 Всего: 11 |
Эту: char* buf = (char*)malloc((strlen(trm) + strlen(gg)) * sizeof(char) + 1); -------------------- Если Вы получили ответ на Ваш вопрос, то нажмите на "Вопрос решен". Бьем спамеров их же оружием. Пусть весь спам сыпется им [email protected] |
|||
|
||||
Dov |
|
|||
![]() аСинизатор ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1721 Регистрация: 10.5.2003 Где: Эрец-Исраэль Репутация: 15 Всего: 88 |
покажи - как.
-------------------- Тут вечности запах томительный, И свежие фрукты дешевые, А климат у нас – изумительный, И только соседи – #уевые. Игорь Губерман. |
|||
|
||||
DeadSoul |
|
|||
Эксперт ![]() ![]() ![]() Профиль Группа: Участник Сообщений: 1217 Регистрация: 25.9.2005 Где: Москва Репутация: 2 Всего: 11 |
Прощу прощения. Забыл поставить копирайт - MSDN Это сообщение отредактировал(а) DeadSoul - 16.12.2005, 01:30 -------------------- Если Вы получили ответ на Ваш вопрос, то нажмите на "Вопрос решен". Бьем спамеров их же оружием. Пусть весь спам сыпется им [email protected] |
|||
|
||||
Dov |
|
|||
![]() аСинизатор ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1721 Регистрация: 10.5.2003 Где: Эрец-Исраэль Репутация: 15 Всего: 88 |
DeadSoul, ты здесь покажи, на этом примере
-------------------- Тут вечности запах томительный, И свежие фрукты дешевые, А климат у нас – изумительный, И только соседи – #уевые. Игорь Губерман. |
|||
|
||||
DeadSoul |
|
||||
Эксперт ![]() ![]() ![]() Профиль Группа: Участник Сообщений: 1217 Регистрация: 25.9.2005 Где: Москва Репутация: 2 Всего: 11 |
Но пример, плохой. Мой вариант:
-------------------- Если Вы получили ответ на Ваш вопрос, то нажмите на "Вопрос решен". Бьем спамеров их же оружием. Пусть весь спам сыпется им [email protected] |
||||
|
|||||
Dov |
|
|||
![]() аСинизатор ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1721 Регистрация: 10.5.2003 Где: Эрец-Исраэль Репутация: 15 Всего: 88 |
И шо, у тебя такое работает ? Это сообщение отредактировал(а) Dov - 16.12.2005, 02:00 -------------------- Тут вечности запах томительный, И свежие фрукты дешевые, А климат у нас – изумительный, И только соседи – #уевые. Игорь Губерман. |
|||
|
||||
qBiN |
|
||||||
Новичок Профиль Группа: Участник Сообщений: 11 Регистрация: 15.12.2005 Репутация: нет Всего: нет |
Настчет кода с malloc,че-та нидонал мальца...Распишите на Могучим Русском языке,если не затруднит. Dov респект за код =) |
||||||
|
|||||||
Aleksandor |
|
||||
![]() Практик ![]() ![]() Профиль Группа: Участник Сообщений: 272 Регистрация: 22.11.2005 Где: россия, зеленогра д Репутация: 0 Всего: 12 |
qBiN В твоем примере для trm системой резервируется 3 байта (длина строки "ad" плюс нолик) , но потом в trm пишутся еще 4 байта("vere") - переполнение! Резервируй по меньшей мере 7 байт (последний для нуля)
или так
Это сообщение отредактировал(а) Aleksandor - 16.12.2005, 10:39 -------------------- Call out Gouranga be happy!!! Gouranga Gouranga Gouranga .... That which brings the highest happiness!! |
||||
|
|||||
qBiN |
|
|||
Новичок Профиль Группа: Участник Сообщений: 11 Регистрация: 15.12.2005 Репутация: нет Всего: нет |
Если остается то как отреагируют функции работающие со строками? С malloc'ом разобрался.Спасибо всем отписавшемся. Тему думаю можно закрывать... ![]() |
|||
|
||||
blackofe |
|
||||
![]() Бывалый ![]() Профиль Группа: Участник Сообщений: 173 Регистрация: 29.11.2005 Репутация: 4 Всего: 4 |
нолик в конце строки - всего лишь признак ее окончания. его назначение - дать строковым функциям знать, где заканчиваются актуальные данные. сам нолик - не данные. поэтому функции типа sprintf, strcat, strcpy работают только с ненулевыми символами, игнорируя нулевые (вернее, используя их для особых целей - узнать, что строка закончилась). тем не менее под ноль тоже надо отводить память. исходя из вышеизложенного, sprintf возьмет 2 байта первой строки ("ad"), четыре байта второй строки ("vere"), запишет их в буфер bob и в конце (на 6-месте) добавит нолик, дабы потом другие строковые функции могли работать с результирующей строкой (могли узнать, где строка заканчивается). Это сообщение отредактировал(а) blackofe - 16.12.2005, 21:31 |
||||
|
|||||
sergejzr |
|
||||
![]() Un salsero ![]() Профиль Группа: Админ Сообщений: 13285 Регистрация: 10.2.2004 Где: Германия г .Ганновер Репутация: 19 Всего: 360 |
Вылетает, потому что
"tramparam"; VC считает константным, занятым и вылетает, когда пытаешься туда чего нибудь вписать. Копмиль в релиз и вылетать не будет, но это не значит, что так делать красиво.
А почему не должно работать?
Ты же его переписываешь. |
||||
|
|||||
![]() ![]() ![]() |
Правила форума "С++:Общие вопросы" | |
|
Добро пожаловать!
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn |
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей) | |
0 Пользователей: | |
« Предыдущая тема | C/C++: Общие вопросы | Следующая тема » |
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |