Форум программистов, компьютерный форум, киберфорум
Наши страницы
C для начинающих
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.75/4: Рейтинг темы: голосов - 4, средняя оценка - 4.75
viktorius
2 / 2 / 3
Регистрация: 24.02.2013
Сообщений: 105
1

Ошибка освобождения динамической памяти

20.09.2013, 02:55. Просмотров 802. Ответов 3
Метки нет (Все метки)

Столкнулся с проблемой ошибка при очистке динамической памяти помогите разобраться что я сделал не так
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
#include <stdio.h>//типа кросворд из двух слов
#include <stdlib.h>
#include <string.h>
#include <time.h>
#define A 20
 
char *Input(int *cw)//ввожу два слова в динамический массив
{
    int i;
    char **words = 0, wd[A];//динамический массив и массив для слова
    printf("input two words\n");
    words = calloc(*cw, 1);
    for(i = 0; i < *cw; i++)
    {
        scanf("%s",wd);
        words[i] = calloc(strlen(wd)+1, 1);
        strcpy(words[i], wd);
    }
    return words;
}
 
int *Sort(char **words, int *t)// определение пересечений слов
{
    int i, j, **n = 0, *c = 0;
    for(i = 0; words[0][i]; i++)
        for(j = 0; words[1][j]; j++)
            if(words[0][i] == words[1][j])
            {
                n = realloc(n, (++*t * sizeof(int*)));
                n[*t-1] = calloc(2, sizeof(int));
                n[*t-1][0] = i + 1;
                n[*t-1][1] = j + 1;
            }
    if(!*t)//если пересечений нет выходим
    {
        printf("no matches found\n");
        exit(1);
    }
    srand(time(0));
    c = calloc(3, sizeof(int));
    c[0] = rand() % 2;//определяем слово по вертикали и горизонтали
    i = rand() % *t;//определяем случайное перечисление
    c[1] = n[i][0];
    c[2] = n[i][1];
    for(i = 0; i < *t; i++)
        free(n[i]);
    free(n);
    return c;
}
 
void Print(char **words, int *c)
{
    int i, j, a, b, t1, t2 = 0, t3 = 1;
    char *t;
    if(c[0])//определение слова вертикаль горизонталь
    {
        t = words[0];
        words[0] = words[1];
        words[1] = t;
        t1 = c[t2+1];
        c[t2+1] = c[t3+1];
        c[t3+1] = t1;
        t1 = t2;
        t2 = t3;
        t3 = t1;
    }
    b = strlen(words[t2]);
    a = strlen(words[t3]);
    for(i = 0; i < a; i++)
    {
        for(j = 0; j < b; j++)
        {
            if(c[t3+1] - 1 == i)
                putc(words[t2][j], stdout);
            else if(c[t2+1] - 1 == j)
                putc(words[t3][i], stdout);
            else
                putc('-', stdout);
        }
        putc('\n', stdout);
    }
}
 
int main()
{
    char **words = 0;
    int cw = 2, t = 0, *c = 0, i;
    words = Input(&cw);
    c = Sort(words, &t);
    Print(words, c);
    free(c);
    for(i = 0; i < cw; i++)
        free(words[i]);
    free(words);//здесь ошибку выдает!!!!!!
    system("pause");
    return 0;
}
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
20.09.2013, 02:55
Ответы с готовыми решениями:

Malloc ошибка освобождения памяти
ЧЯДНТ? Косяк такой: heap corruption detected before normal block (№0) at...

Ошибка при переходе в функцию освобождения памяти из под списка
При переходе в функцию Clear вылетает с сообщением что куча была повреждена....

Распределение памяти для выделения и освобождения блоков памяти внутри запрошенного пула
В программе малые&quot;дыры&quot; избегают,что нужно сделать что бы малые &quot;дыры&quot; не...

Почему после освобождения памяти получается записать туда значение
Здравствуйте! Вот код: #include &lt;stdio.h&gt; #include &lt;stdlib.h&gt; int...

Выделение динамической памяти
Чтобы выделить динамическую память под символьный массив надо так: int n;...

3
rotas
336 / 19 / 1
Регистрация: 15.05.2012
Сообщений: 23
20.09.2013, 04:25 2
Разберитесь с ф-цией calloc.
Вторым параметром ей передают размер типа элемента массива.
Тут выделяете cw однобайтовых элементов.
C
1
words = calloc(*cw, 1);
, думаю, указатели рушатся есчо где-то тут
C
1
words[i] = calloc(strlen(wd)+1, 1);
так как указатели занимают больше памяти, чем выделяется, далее может падать где угодно.
0
viktorius
2 / 2 / 3
Регистрация: 24.02.2013
Сообщений: 105
20.09.2013, 04:58  [ТС] 3
Цитата Сообщение от rotas Посмотреть сообщение
Разберитесь с ф-цией calloc.
Вторым параметром ей передают размер типа элемента массива.
Тут выделяете cw однобайтовых элементов.
C
1
words = calloc(*cw, 1);
, думаю, указатели рушатся есчо где-то тут
C
1
words[i] = calloc(strlen(wd)+1, 1);
так как указатели занимают больше памяти, чем выделяется, далее может падать где угодно.
с calloc все впорядке размер char всегда 1 байт и количество верно указано

Добавлено через 7 минут
вот здесь ошибка была 12 строчка words = calloc(*cw, sizeof(char*)); вот так все ок
0
rotas
336 / 19 / 1
Регистрация: 15.05.2012
Сообщений: 23
20.09.2013, 05:17 4
Я это и имел ввиду. char один байт, а указатель на любой тип - 4/8 байт в зависимости от разрядности системы (для x32/x64).
0
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
20.09.2013, 05:17

Выделение динамической памяти
В одномерном массиве,*состоящем из п вещественных элементов, вычислить: -...

Создать массив в динамической памяти
Мне надо создать массив в динамической памяти (на Си) из n элементов: char...

Сохранение данных в динамической памяти
Есть у меня такая задача: Объявить массив из N указателей, каждый из которых...


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

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

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