![]() |
|
Модераторы: bsa |
![]()
|
|
| paperstreet7 |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 48 Регистрация: 4.12.2009 Где: Омск Репутация: нет Всего: 1 |
Здравствуйте!
Читаю книгу Стивена Прата "Язык Си" 1988 года. Многое там не совпадает с нынешней действительностью, но это единственная бумажная книга, которая у меня есть. До этого немного учил С++. Вот решил забегая вперед написать код с двумя функциями. Коротко о том, что делает программа - она спрашивает имя пользователя, заносит в переменную и по желанию пользователя подсчитывает количество букв в его имени.
Code::blocks после компиляции выдает 0 ошибок и 2 предупреждения: \Documents\hello_world.c||In function 'main':| \Documents\hello_world.c|20|warning: passing argument 1 of 'OK_function' makes integer from pointer without a cast| \Documents\hello_world.c|4|note: expected 'char' but argument is of type 'char *'| \Documents\hello_world.c||In function 'OK_function':| \Documents\hello_world.c|33|warning: incompatible implicit declaration of built-in function 'strlen'| ||=== Build finished: 0 errors, 2 warnings ===| Во время запуска программы Windows 7 выдает сообщение об ошибке и предлагает сделать отладку с помощью MS Visual Studio 2010. Я отклоняю предложение и вижу что консоль тоже выдала ошибку: process returned -107374... Теперь собственно сам вопрос: я так понял, что здесь что-то не так с указателями (я эту тему еще не проходил и их не использовал) и с функцией strlen(). А вот что именно не так, не понятно. Добавлено через 11 минут и 35 секунд Я вот думаю, правильно ли я сделал, что поставил return 0; в функциях или надо было return void; И еще не уверен в синтаксисе strlen() Компилятор gcc-mingw Система Win 7 64-bit; процессор Intel Celeron D 3333 Ghz; |
|||
|
||||
| newbee |
|
|||
![]() Бревно ![]() ![]() Профиль Группа: Участник Сообщений: 703 Регистрация: 24.8.2011 Репутация: 3 Всего: 19 |
#include<string.h> - в начало и OK_FUNCTION должен принимать тип char*, так как это строка, а просто char - это один символ, грубо говоря буква, строки.
-------------------- You're face to face With man who sold the world |
|||
|
||||
| volatile |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2107 Регистрация: 7.1.2011 Репутация: 16 Всего: 85 |
||||
|
||||
| Чoо |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 313 Регистрация: 22.9.2009 Репутация: 4 Всего: 4 |
с диском это фантастика, не?
-------------------- ![]() OS: Debian Squeeze (kernel 3.8.2) IDE: qtCreator 1.3.1; Eclipse SDK 3.5.2 |
|||
|
||||
| rodnover |
|
|||
|
Бывалый ![]() Профиль Группа: Участник Сообщений: 223 Регистрация: 7.4.2009 Репутация: 2 Всего: 10 |
Не. Стандартная фича переполнения стека.
|
|||
|
||||
| paperstreet7 |
|
||||
|
Новичок Профиль Группа: Участник Сообщений: 48 Регистрация: 4.12.2009 Где: Омск Репутация: нет Всего: 1 |
Сделал все как написано. Ошибок 0, предупреждений 0. При выполнении все равно выдает ошибку. Пробовал тоже самое в Dev-C++. Тот же результат. Вот код:
Это сообщение отредактировал(а) paperstreet7 - 2.9.2011, 21:23 |
||||
|
|||||
| paperstreet7 |
|
||||||
|
Новичок Профиль Группа: Участник Сообщений: 48 Регистрация: 4.12.2009 Где: Омск Репутация: нет Всего: 1 |
Я понял в чем было дело. Пришлось комментировать куски кода, чтобы выявить проблемную строку.
А нужно было вот так:
Вот окончательная рабочая версия кода:
Добавлено через 3 минуты и 23 секунды Все. Всем спасибо! Тема закрыта. |
||||||
|
|||||||
| Чoо |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 313 Регистрация: 22.9.2009 Репутация: 4 Всего: 4 |
есть где почитать об этом? -------------------- ![]() OS: Debian Squeeze (kernel 3.8.2) IDE: qtCreator 1.3.1; Eclipse SDK 3.5.2 |
|||
|
||||
| volatile |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2107 Регистрация: 7.1.2011 Репутация: 16 Всего: 85 |
Чoо, недалеко после строки, расположен адрес возврата из функции. Если введенная строка превысит размер, она затрет этот адрес. В результате функция после завершения, вернется не туда, откуда она была вызвана, а неизвестно куда. И выполнит там неизвестно что. Скорей всего конечно прога просто повиснет, но может и диск отформатировать... наберите в поисковике "переполнеие стека", если уж нужна более подробная инфа... Это не решение проблемы. У пользователя может запасть клавиша, и диск таки будет отформатирован Более менее маломальская защита от дурака:
|
|||
|
||||
| Чoо |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 313 Регистрация: 22.9.2009 Репутация: 4 Всего: 4 |
volatile, оК, погуглю, спасиб
вообще я первое время за пределы массива выходил довольно часто, пока не привык как надо работать. Хорошо программа завершалась не так фатально -------------------- ![]() OS: Debian Squeeze (kernel 3.8.2) IDE: qtCreator 1.3.1; Eclipse SDK 3.5.2 |
|||
|
||||
| rodnover |
|
|||
|
Бывалый ![]() Профиль Группа: Участник Сообщений: 223 Регистрация: 7.4.2009 Репутация: 2 Всего: 10 |
Ну запавшей клавишей диск только у клавиатуры Чака Норриса диск сможет отформатироваться, но если контроллер клавиатуры заглючит и начнет двоичную строку в стек писать.
wasm.ru там куча подобной инфы. Это сообщение отредактировал(а) rodnover - 3.9.2011, 06:35 |
|||
|
||||
![]()
|
| Правила форума "C/C++: Для новичков" | |
|
|
Запрещается! 1. Публиковать ссылки на вскрытые компоненты 2. Обсуждать взлом компонентов и делиться вскрытыми компонентами
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, JackYF, bsa. |
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | C/C++: Для новичков | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |