Форум программистов, компьютерный форум, киберфорум
Наши страницы

C для начинающих

Войти
Регистрация
Восстановить пароль
 
vlinx
1 / 1 / 0
Регистрация: 27.06.2014
Сообщений: 74
#1

Программа по генерации 7-значного номера время от времени (не всегда) падает с ошибкой memory violation - C (СИ)

18.08.2014, 16:56. Просмотров 558. Ответов 12
Метки нет (Все метки)

Добрый день.

моя программа по генерации 7-значного номера время от времени (не всегда) падает с ошибкой memory violation : Exception ACCESS_VIOLATION received.

C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
char* get_username()
{
    char* username;
    int curr_num = 0;
    char buff[2] = {'\0'};
    memset(buff, 0, sizeof(buff));
 
    if ((username = (char*)malloc(7 + 1)) == NULL)
    {
        to_mylog("Insufficient memory available"); 
        return NULL; 
    }
 
    srand(time(NULL));
    
/////////////////////////////
 
    for(i = 0; i < 7; i++)
    {
        curr_num = rand() % 10;
        itoa(curr_num, buff, 10);
                strcat(username, buff);
    }
 
    to_mylog("%s\n", username);
 
    username[7] = '\0';
 
    return username;
}
проблема, судя по ошибке - в указателях, почему при непродолжительной работе программа начинает падать?

Добавлено через 7 минут
добавлю, иногда ф-ия возвращает правильную строку, например 8906886, и программа отрабатывает нормально, но спустя некоторое время, ф-ия начинает возвращать строки типа þ8906886, тоесть в начале какие то кракозябры, и в этом случае уже нарушение доступа к памяти
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
18.08.2014, 16:56
Я подобрал для вас темы с готовыми решениями и ответами на вопрос Программа по генерации 7-значного номера время от времени (не всегда) падает с ошибкой memory violation (C (СИ)):

Программа падает с ошибкой - Free Pascal
Доброго времени суток уважаемые форумчане. Возникла не большая проблема... Задание достаточно тривиальное. Пользователь задает...

Программа слетает с ошибкой .Access violation At ... Address - C++ Builder
Доброе время суток. Народ, нужна небольшая консультация. Я на С++ Builder только начинаю писать. Суть вопроса Есть форма. На...

VLClib - спустя час программа падает с ошибкой - C# WPF
Имеется проект WPF С# NET 4/0. Разработка ведется под Win 7 x64 VS2012. После запуска на Win XP (x86) падает спустя час полтора. ...

Virtual Dub, ошибка во время рендеринга: An out-of-bounds memory access (access violation) - Видеопрограммы
Virtual Dub ошибка во время рендинга, осталось совесем чуть чуть и тут ошыбка. Но так не со всеми видео,а с некоторыми.

Время от времени не разрешаются имена, с dns-сервером связь есть всегда - Администрирование Windows
Ребята, кто сталкивался с подобным: время от времени не разрешаются имена. с ns-сервером связь есть всегда. Вопрос решаю очисткой...

При выключении, программа не всегда успевает записать время выключения в файл - C#
Создаю утилиту, которая запускается при включении компьютера и собирает статистику (например, время работы компьютера) Появилась такая...

12
Вованя
137 / 134 / 48
Регистрация: 20.02.2014
Сообщений: 478
Завершенные тесты: 1
18.08.2014, 17:21 #2
Цитата Сообщение от vlinx Посмотреть сообщение
C
1
2
3
4
5
6
for(i = 0; i < 7; i++)
   {
       curr_num = rand() % 10;
       itoa(curr_num, buff, 10);
             strcat(username, buff);
   }
C
1
2
3
    for(int i = 0; i < 7; ++i) {
        username[i] = rand()%10 + '0';
    }
И
Цитата Сообщение от vlinx Посмотреть сообщение
C
1
2
char buff[2] = {'\0'};
   memset(buff, 0, sizeof(buff));
можно сделать в одну строку
C
1
char buff[2] = {'\0'};
Заполнит все нулями, т.е memset тут не нужен.
0
vlinx
1 / 1 / 0
Регистрация: 27.06.2014
Сообщений: 74
18.08.2014, 17:23  [ТС] #3
Вованя, у меня вопрос заключается в другом.
0
Вованя
137 / 134 / 48
Регистрация: 20.02.2014
Сообщений: 478
Завершенные тесты: 1
18.08.2014, 17:29 #4
Цитата Сообщение от vlinx Посмотреть сообщение
у меня вопрос заключается в другом.
Ну тогда в руки дебаггер и отлавливать access violation.
0
vlinx
1 / 1 / 0
Регистрация: 27.06.2014
Сообщений: 74
18.08.2014, 17:48  [ТС] #5
Именно это я и сделал, и из всей программы выяснил что виновник - эта функция. Кстати, Вованя, я попробовал Ваш вариант и убрал strcat, теперь кракозябры появляются в конце номера а не в начале.
Как можно изменить код, чтобы возвращался только номер без кракозябр? может что-то почистить еще надо?
0
Вованя
137 / 134 / 48
Регистрация: 20.02.2014
Сообщений: 478
Завершенные тесты: 1
18.08.2014, 17:57 #6
Цитата Сообщение от vlinx Посмотреть сообщение
что виновник - эта функция
ну по идее вы должны были бы сразу и строчку узнать, где происходит выход в чужую память.
Цитата Сообщение от vlinx Посмотреть сообщение
теперь кракозябры появляются в конце номера а не в начале.
Поместите этот код
C
1
username[7] = '\0';
после цикла с генерацией номера.
1
castorsky
1972 / 1075 / 79
Регистрация: 29.11.2013
Сообщений: 3,354
18.08.2014, 18:49 #7
Цитата Сообщение от vlinx Посмотреть сообщение
C
1
for(i = 0; i < 7; i++) { curr_num = rand() % 10; itoa(curr_num, buff, 10); strcat(username, buff); }
переписывается на:
C
1
2
3
4
for(i = 0; i < 7; i++)
    {
        username[i] = rand() % 10 + '0';
    }
А падает программа потому что сначала вызывается to_mylog, а потом только username заканчивается нулем. Нужно поменять эти строки местами.
1
vlinx
1 / 1 / 0
Регистрация: 27.06.2014
Сообщений: 74
19.08.2014, 11:36  [ТС] #8
Вованя, точно! какая досадная ошибка(
спасибо всем
0
Vtulhu
371 / 377 / 96
Регистрация: 12.08.2011
Сообщений: 1,610
19.08.2014, 22:45 #9
Я вообще не люблю выделение памяти, особенно если освобождать ее придется в другом месте. Почему не сделать так?
C
1
2
3
4
5
6
7
8
9
char* get_username(void)
{
    static char username[8];
    for( i = 0; i < 7; ++i ) {
        username[i] = rand() % 10 + '0';
    }
    username[7] = '\0';
    return username;
}
Я однажды на таком принципе всю архитектуру программы построил. Очень удобно! Тот факт, что память выделена один раз, приводит к тому, что при повторном вызове функции они перезатрутся. Это редко когда имеет значение, но если имеет - данные можно тупо скопировать. А забыть об этом невозможно (потому что все данные в программе были организованы таким способом). В отличие от реальной опасности забыть освободить память. Да, и еще. делать srand(time(NULL)) внутри функции - крайне плохо. Это должно быть сделано всего один раз за все время жизни программы. В крайнем случае, если надо для целей тестирования сделать результат предсказуемым, можно сделать вот так:

C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
char* get_username(const unsigned int seed)
{
    srand(seed);
    // и дальше
}
 
// Причем вызывать функцию надо будет не так
 
char* username = get_username(time(NULL));
 
// А вот так:
 
srand(time(NULL)); // один раз в самом начале программы!
// некая часть программы
char* username = get_username(rand()); // и каждый аналогичный вызов вот такой
0
vlinx
1 / 1 / 0
Регистрация: 27.06.2014
Сообщений: 74
20.08.2014, 10:42  [ТС] #10
Цитата Сообщение от Vtulhu Посмотреть сообщение
Я вообще не люблю выделение памяти, особенно если освобождать ее придется в другом месте. Почему не сделать так?
А я не вижу в выделении памяти в куче ничего плохого, нужно только освободить.
static использую только в рекурсивных ф-ях.

srand(time(NULL)) внутри функции - плохо. Согласен.
0
castorsky
1972 / 1075 / 79
Регистрация: 29.11.2013
Сообщений: 3,354
20.08.2014, 12:51 #11
Цитата Сообщение от Vtulhu Посмотреть сообщение
Тот факт, что память выделена один раз, приводит к тому, что при повторном вызове функции они перезатрутся.
Когда мы почту пешком на луне завтра в руки навсегда!
Цитата Сообщение от Vtulhu Посмотреть сообщение
Я вообще не люблю выделение памяти
Видимо, Вы просто не умеете их готовить.
0
Вованя
137 / 134 / 48
Регистрация: 20.02.2014
Сообщений: 478
Завершенные тесты: 1
20.08.2014, 15:46 #12
Цитата Сообщение от vlinx Посмотреть сообщение
srand(time(NULL)) внутри функции - плохо. Согласен.
Почему плохо то?
0
vlinx
1 / 1 / 0
Регистрация: 27.06.2014
Сообщений: 74
20.08.2014, 15:58  [ТС] #13
Цитата Сообщение от Вованя Посмотреть сообщение
Почему плохо то?
Ну конкретно в моей ф-ии считаю что нужно убрать эту строку потому что ф-ия должна делать только то что должна, а именно генерить имя. А инициализацию ГСПЧ п-ль сам должен вызвать 1 раз в начале - перед вызовом ф-ии.
0
20.08.2014, 15:58
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
20.08.2014, 15:58
Привет! Вот еще темы с ответами:

Определить номера всех поездов, отправляющихся после указанного времени и время прибытия заданного поезда - C (СИ)
27. Дан файл, содержащий сведения о поездах дальнего следования. Структура записи файла: номер поезда, пункт назначения (город), время...

Битрикс падает с ошибкой БД - 1С Битрикс
Всем здравия. С ростом количества сайтов в админке и их размерами битрикс начал падать с такой ошибкой Mysql connect error :...

Внезапные БСОДы с ошибкой Physical memory dump failed - BSOD
Всем доброго дня! Несколько дней пк выпадает во внезапные бсоды с ошибкой 0xC000009C (Physical memory dump failed), проверял ссд, на...

Функция CryptUnprotectData падает с ошибкой 13 - C (СИ)
Здравствуйте, форумчане! Столкнулась с такой проблемой: фунция падает с ошибкой с кодом 13. Как решить эту проблему??? int iRet=0; ...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
13
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2018, vBulletin Solutions, Inc.
Рейтинг@Mail.ru