Форум программистов, компьютерный форум, киберфорум
C для начинающих
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.88/8: Рейтинг темы: голосов - 8, средняя оценка - 4.88
1 / 1 / 0
Регистрация: 08.05.2013
Сообщений: 23
1

Ошибка при попытке очистить выделенную память

13.10.2013, 19:22. Показов 1547. Ответов 5
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
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
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
#include <stdio.h>
#include <string.h>
 
#define MAX_WORDS   10
#define MAX_LENGTH  20
 
int ReadWords(char *pWords[]);
void PrintWords(char *pWords[], int counter);
void SortWords(char *pWords[], int counter);
void FreeMemory(char *pWords[], int counter);
 
int main()
{
    char *pWords[MAX_WORDS] = {NULL};
    int wordsCounter;
 
    if ((wordsCounter = ReadWords(pWords)) == -1)
    {
        printf("Failed allocation memory\n");
        return -1;
    }
 
    printf("\nUnsorted list:\n");
    PrintWords(pWords, wordsCounter);
 
    SortWords(pWords, wordsCounter);
    printf("Sorted list:\n");
    PrintWords(pWords, wordsCounter);
 
    FreeMemory(pWords, wordsCounter);
    getch();
    return 0;
}
 
void SortWords(char *pWords[], int counter)
{
    int index;
    char *tempWord;
    char isSorted;
 
    isSorted = 0;
    while (isSorted == 0)
    {
        isSorted = 1;
        for (index = 0; index < (counter - 1); index++)
            if (strcmp(pWords[index], pWords[index + 1]) > 0)
            {
                isSorted = 0;
                tempWord = pWords[index + 1];
                pWords[index + 1] = pWords[index];
                pWords[index] = tempWord;
            }
    }
}
 
int ReadWords(char *pWords[])
{
    int charCounter;
    int index = 0;
    int ch;
    char *tempPointer = NULL;
    char word[MAX_LENGTH + 1];
 
    do
    {
        tempPointer = word;
        charCounter = 0;
        while (((ch = getchar()) != '\n') && (ch != EOF))
            if (charCounter++ < MAX_LENGTH)
                *tempPointer++ = ch;
        *tempPointer = '\0';
 
        if (charCounter > MAX_LENGTH)
            continue;
        else if (charCounter != 0)
        {
            tempPointer = NULL;
            tempPointer = (char *)malloc(strlen(word));
            if (tempPointer == NULL)
            {
                index = -1;
                break;
            }   
            strcpy(tempPointer, word);
            pWords[index++] = tempPointer;
        }
    } while ((charCounter != 0) && (index < MAX_WORDS));
 
    return index;
}
 
void PrintWords(char *pWords[], int counter)
{
    while (counter-- > 0)
        printf("%s\n", *pWords++);
    putchar('\n');
}
 
void FreeMemory(char *pWords[], int counter)
{
    while (counter-- > 0)
        free(pWords++);
}
Программа сортирует строки(не более 10-ти) длиной не более 20 символов. В конце, после сортировки и вывода на экран, программа при попытке выполнить функцию free(pWords) выводит окно с сообщением:
"Debug Assertion Failed!
....................................
Expression: _CrtIsValidHeapPointer(pUserData)
................................................................"
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
13.10.2013, 19:22
Ответы с готовыми решениями:

При попытке очистить память программа память программа падает
#include &lt;stdio.h&gt; #include &lt;string.h&gt; #include &lt;stdlib.h&gt; struct string { char str; ...

Ошибка передачи указателя на выделенную память
Ситуация следующая, при первом добавлении элемента все хорошо, как только добавляю второй элемент...

Ошибка при попытке очистить дерево дважды или попытке очистить и заново заполнить
Привет, нужно написать программу с деревьями ( VS, формы) однако возникли проблемы: есть функции ...

Очистить динамическую память, выделенную под член структуры
Объявление и инициализация объекта: pupil B = Constructor(&quot;MyName&quot;, 18, 50); Сама структура:...

5
202 / 200 / 65
Регистрация: 06.10.2013
Сообщений: 552
13.10.2013, 19:51 2
C
1
2
while (counter-- > 0)
        free(pWords[counter]);
1
1 / 1 / 0
Регистрация: 08.05.2013
Сообщений: 23
13.10.2013, 21:37  [ТС] 3
Цитата Сообщение от XZentus Посмотреть сообщение
C
1
2
while (counter-- > 0)
        free(pWords[counter]);
И? Да, я сам писал код. И мне действительно кажется, что всё правильно написано, но похоже что нет, и я не знаю, в чем тут ошибка

Добавлено через 1 час 26 минут
Цитата Сообщение от XZentus Посмотреть сообщение
C
1
2
while (counter-- > 0)
        free(pWords[counter]);
Опять ошибка. Только теперь: "HEAP CORRUPTION DETECTED: after Normal block (#58) at 0x00344BF0. CRT detected that the application wrote to memory after end of heap buffer"
0
544 / 93 / 49
Регистрация: 16.12.2011
Сообщений: 317
14.10.2013, 00:45 4
qwe321, у вас похоже не в функции очистки проблема. Вы код постепенно отлаживали, или написали все а потом начали смотреть: где же ошибка?
0
419 / 418 / 167
Регистрация: 28.11.2010
Сообщений: 1,183
14.10.2013, 00:51 5
C
1
tempPointer = (char *) malloc(strlen(word)+1);
1
1 / 1 / 0
Регистрация: 08.05.2013
Сообщений: 23
14.10.2013, 12:07  [ТС] 6
Цитата Сообщение от VEINHORN Посмотреть сообщение
qwe321, у вас похоже не в функции очистки проблема. Вы код постепенно отлаживали, или написали все а потом начали смотреть: где же ошибка?
Функцию очистки в самом конце добавил)

Добавлено через 46 секунд
Цитата Сообщение от vua72 Посмотреть сообщение
C
1
tempPointer = (char *) malloc(strlen(word)+1);
Неа, то же самое =(

Добавлено через 2 минуты
Цитата Сообщение от XZentus Посмотреть сообщение
C
1
2
while (counter-- > 0)
        free(pWords[counter]);
Цитата Сообщение от vua72 Посмотреть сообщение
C
1
tempPointer = (char *) malloc(strlen(word)+1);
Комбинация дала нужный результат =) спс
0
14.10.2013, 12:07
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
14.10.2013, 12:07
Помогаю со студенческими работами здесь

Почему при записи в не выделенную память программа не падает?
Разбираюсь с malloc(), делаю так: #include &lt;stdio.h&gt; #include &lt;stdlib.h&gt; #include &lt;string.h&gt; ...

Нарушение прав доступа при записи значения в выделенную память
суть такая,есть игра ,игру запустил,запустил артмани,нашел адрес и значение которое в нем хранится....

Попытка чтения или записи в защищенную память при попытке воспроизвести поток
что не так? при попытке воспроизвести поток на последней строчке возникает исключение...

Удалить динамически выделенную память
Получится ли освободить динамически выделенную память в интерфейсе одного класса, в интерфейсе...


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

Или воспользуйтесь поиском по форуму:
6
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru