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

Работа с динамической памятью

02.04.2015, 17:03. Просмотров 753. Ответов 22
Метки нет (Все метки)

Привет всем. Я недавно начал изучать C++ и наткнулся на ошибку:"двумерный динам.exe вызвал срабатывание точки останова" при очистке динамической памяти.Подозреваю, что дело в неправильно выделенной памяти,но устранить не могу.
главная функция:
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
104
105
106
107
108
#include <iostream>
#include <malloc.h>
#include "din_mass.h"
#pragma warning (disable:4996)
///функция формирует квадратную матрицу S размера n*n нужными значениями
void FillArray(double **S)
{
    for (int i = 1; i <= ((int*)S)[-1]; i++)
    {
        for (int j = 1; j <= ((int*)S)[-2]; j++)
        {
            S[i][j] = log10(i+j);
        }
    }
}
///функция осуществляет вывод матрицы S размера n*n
void PrintArray(double **S)
{
    for (int i = 1; i <= ((int*)S)[-1]; i++)
    {
        for (int j = 1; j <= ((int*)S)[-2]; j++)
        {
            printf("%lf ", S[i][j]);
        }
        printf("\n");
    }
}
///функция осуществляет сложение элементов главной диагонали матрицы S размера n*n
void SummElements(double **S)
{
    double summ=0;
    for (int i = 1; i <= ((int*)S)[-1]; i++)
    {
        for (int j = 1; j <=((int*)S)[-2]; j++)
        {
            if (i == j)
            {
                summ += S[i][j];
            }
        }
    }
    printf("сумма элементов равна:%lf\n", summ);
}
///функция формирует одномерный массив S2 состоящий из элементов главной диагонали матрицы S
 void FillArray2(double **S, double *S2)
{
    int k = 0;
    for (int i = 1; i <= ((int*)S)[-1]; i++)
    {
        for (int j = 1; j <= ((int*)S)[-2]; j++)
        {
            if (i == j)
            {
                S2[k] = S[i][j];
                k++;
            }
        }
 
    }
}
 ///функция сортирует в порядке убывания элементы одномерного массива S2 размера n
 void SortElements(double *S2,double **S)
 {
     int sort;
     double p;
     do
     {
         sort = true;
         for (int i = 0; i <((int*)S)[-1]; i++)
         {
             if (S2[i] < S2[i + 1])
             {
                 p = S2[i];
                 S2[i] = S2[i + 1];
                 S2[i + 1] = p;
                 sort = false;
             }
         }
     } while (sort == false);
 }
 ///функция выводит элементы массива S2 на экран
 void PrintArray2(double *S2,double **S)
 {
     for (int i = 0; i <((int*)S)[-1]; i++)
     {
         printf("%lf ",S2[i]);
     }
 }
 
int main()
{
    setlocale(0, "");
    double **S=Creation2D();
    int n = ((int*)S)[-1];
    double * S2 = (double *)malloc(sizeof(double)*n);
    FillArray(S);
    printf("массив:\n");
    PrintArray(S);
    SummElements(S);
    FillArray2(S, S2);
    printf("элементы главной диагонали в порядке убывания\n");
    SortElements(S2,S);
    PrintArray2(S2,S);
    printf("\n");
    free(S2);
    FreeCreation2D(S);
    system("pause");
}
А это код заголовочного файла:
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
#include <malloc.h>
#include <iostream>
#pragma warning (disable:4996)
///функция возвращает указатель на динамически созданный массив из n строк и n столбцов
double ** Creation2D()
{
    int n;
    printf("Введите размеры массива:\n");
    scanf("%d", &n);
    double**S = (double**)malloc(sizeof(double*)*n + sizeof(int) * 2);
    ((int*)S)[0] = n;
    ((int*)S)[1] = n;
    (int*)S++;
    (int*)S++;
    for (int i = 1; i <= n; i++)
    {
        S[i] = (double*)malloc(sizeof(double)*n);
    }
 
    return S;
}
///функция освобождает память от двухмерного массива S
void FreeCreation2D(double **S)
{
    
    for (int i = 1; i <=((int*)S)[-1]; i++)
    {
        free(S[i]);
    }
    free(S);
}
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
02.04.2015, 17:03
Ответы с готовыми решениями:

Работа с динамической памятью
При вызове деструктора ошибка: &quot;Ошибка C2227 выражение слева от &quot;-&gt;next&quot; должно...

Работа с динамической памятью!
Привет! Такая задача: Необходимо выделить(по N Кб) и освободить всю...

Работа с динамической памятью
Всем привет! Начинающий программист(около нескольких недель), сейчас пишу...

Работа структур с динамической памятью
Здравствуйте! Решил немного поэкспериментировать с тем чтобы положить...

Работа с динамической памятью в цикле
Всем привет. Есть переменная data, созданная динамически На каждой...

22
lss
930 / 859 / 355
Регистрация: 10.10.2012
Сообщений: 2,705
02.04.2015, 17:13 2
Цитата Сообщение от mracobes9 Посмотреть сообщение
А это код заголовочного файла:
Не по теме: реализации функций не нужно делать в заголовочных файлах.

Добавлено через 1 минуту
Среда какая?
0
mracobes9
9 / 9 / 2
Регистрация: 02.04.2015
Сообщений: 197
02.04.2015, 17:14  [ТС] 3
Ну я же еще начинающий

Добавлено через 22 секунды
Visual Studio
0
lss
930 / 859 / 355
Регистрация: 10.10.2012
Сообщений: 2,705
02.04.2015, 17:23 4
Не нужно использовать нестандарт:
C++
1
int n = ((int*)S)[-1];
В разных реализациях может быть по разному, в дебаг-релиз может быть по разному.
Кто научил так делать?

Добавлено через 1 минуту
Цитата Сообщение от mracobes9 Посмотреть сообщение
Visual Studio
Какая? В 10-й вот это не компилируется:
Цитата Сообщение от mracobes9 Посмотреть сообщение
log10(i+j);
0
mracobes9
9 / 9 / 2
Регистрация: 02.04.2015
Сообщений: 197
02.04.2015, 17:23  [ТС] 5
по заданию так надо. сохранять размер массива в -1 и -2 элементах
0
lss
930 / 859 / 355
Регистрация: 10.10.2012
Сообщений: 2,705
02.04.2015, 17:23 6
Индексация массивов начинается с 0, а не с 1.
0
mracobes9
9 / 9 / 2
Регистрация: 02.04.2015
Сообщений: 197
02.04.2015, 17:24  [ТС] 7
13 версия

Добавлено через 36 секунд
если с 0 то логарифм не находит
0
lss
930 / 859 / 355
Регистрация: 10.10.2012
Сообщений: 2,705
02.04.2015, 17:26 8
Цитата Сообщение от mracobes9 Посмотреть сообщение
по заданию так надо. сохранять размер массива в -1 и -2 элементах
Вот так?
Цитата Сообщение от mracobes9 Посмотреть сообщение
((int*)S)[0] = n;
* * ((int*)S)[1] = n;
0
mracobes9
9 / 9 / 2
Регистрация: 02.04.2015
Сообщений: 197
02.04.2015, 17:29  [ТС] 9
ну да
0
lss
930 / 859 / 355
Регистрация: 10.10.2012
Сообщений: 2,705
02.04.2015, 17:39 10
Так нельзя делать:
C++
1
2
3
4
5
6
7
8
    double**S = (double**)malloc(sizeof(double*)*n + sizeof(int) * 2);
    ((int*)S)[0] = n;
    ((int*)S)[1] = n;
    (int*)S++;
    (int*)S++;
// ...
    free(S);
// ...
Выделяешь память под указатель, потом меняешь его значение. При освобождении памяти будет ошибка.
0
mracobes9
9 / 9 / 2
Регистрация: 02.04.2015
Сообщений: 197
02.04.2015, 17:41  [ТС] 11
преподаватель говорит что можно
0
lss
930 / 859 / 355
Регистрация: 10.10.2012
Сообщений: 2,705
02.04.2015, 17:45 12
Цитата Сообщение от mracobes9 Посмотреть сообщение
преподаватель говорит что можно
Тогда такой код должен работать. Попробуй:
C++
1
2
3
4
5
6
int main()
{
    double* p = (double*)malloc(sizeof(double) * 10);
    ++p;
    free(p);
}
0
mracobes9
9 / 9 / 2
Регистрация: 02.04.2015
Сообщений: 197
02.04.2015, 17:51  [ТС] 13
не работает
0
alex1315
0 / 0 / 0
Регистрация: 01.04.2015
Сообщений: 1
02.04.2015, 18:05 14
здравствуйте что значит эта строка void FillArray(double **S)
а точнее это ( **S)
0
lss
930 / 859 / 355
Регистрация: 10.10.2012
Сообщений: 2,705
02.04.2015, 18:08 15
Можешь свой код попробовать (с небольшими исправлениями: индексация с 0, и i должен быть меньше n, иначе выход за размер выделенной памяти):
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
int main()
{
    int n;
    printf("Введите размеры массива:\n");
    scanf("%d", &n);
    double**S = (double**)malloc(sizeof(double*)*n + sizeof(int) * 2);
    ((int*)S)[0] = n;
    ((int*)S)[1] = n;
    (int*)S++;
    (int*)S++;
    for (int i = 0; i < n; i++)
    {
        S[i] = (double*)malloc(sizeof(double)*n);
    }
 
    for (int i = 0; i < n/*=((int*)S)[-1]*/; i++)
    {
        free(S[i]);
    }
    free(S); // будет ошибка
 
}
Добавлено через 2 минуты
Цитата Сообщение от alex1315 Посмотреть сообщение
а точнее это ( **S)
Указатель на указатель. Переменная (указатель), которая содержит адрес другого указателя.
1
mracobes9
9 / 9 / 2
Регистрация: 02.04.2015
Сообщений: 197
02.04.2015, 18:16  [ТС] 16
та же фигня

Добавлено через 48 секунд
Цитата Сообщение от lss Посмотреть сообщение
Указатель на указатель. Переменная (указатель), которая содержит адрес другого указателя.
это указатель на массив указателей
0
lss
930 / 859 / 355
Регистрация: 10.10.2012
Сообщений: 2,705
02.04.2015, 18:48 17
Цитата Сообщение от mracobes9 Посмотреть сообщение
та же фигня
Учитывая, что размер указателя и int одинаков (в 32х - битном проекте), то можно так сделать:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
int n;
    printf("Введите размеры массива:\n");
    scanf("%d", &n);
    double**S = (double**)malloc(sizeof(double*)*n + sizeof(int) * 2);
    
    ((int*)S)[0] = n;
    ((int*)S)[1] = n;
    //(int*)S++;
    //(int*)S++;
    for (int i = 0; i < n; i++)
    {
        S[i + 2] = (double*)malloc(sizeof(double)*n);
    }
 
    for (int i = 0; i < ((int*)S)[0]; i++)
    {
        free(S[i + 2]);
    }
    free(S);
Добавлено через 11 минут
Цитата Сообщение от mracobes9 Посмотреть сообщение
это указатель на массив указателей
А указатель на массив указателей - это переменная, которая содержит адрес массива указателей. Адрес массива указателей - это адрес элемента, по индексу 0, этого массива, т.е. адрес указателя.
Цитата Сообщение от lss Посмотреть сообщение
Указатель на указатель. Переменная (указатель), которая содержит адрес другого указателя.
Вот без масива:
C++
1
2
    int* p;
    int** pp = &p;
0
mracobes9
9 / 9 / 2
Регистрация: 02.04.2015
Сообщений: 197
02.04.2015, 18:58  [ТС] 18
теперь работает
0
lss
930 / 859 / 355
Регистрация: 10.10.2012
Сообщений: 2,705
02.04.2015, 19:23 19
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
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
#pragma warning (disable:4996)
///функция формирует квадратную матрицу S размера n*n нужными значениями
void FillArray(double **S)
{
    for (int i = 0; i < ((int*)S)[0]; i++)
    {
        for (int j = 0; j < ((int*)S)[1]; j++)
        {
            S[i + 2][j] = log10((double)(i + 1 + j));
        }
    }
}
///функция осуществляет вывод матрицы S размера n*n
void PrintArray(double **S)
{
    for (int i = 0; i < ((int*)S)[0]; i++)
    {
        for (int j = 0; j < ((int*)S)[1]; j++)
        {
            printf("%lf ", S[i + 2][j]);
        }
        printf("\n");
    }
}
///функция осуществляет сложение элементов главной диагонали матрицы S размера n*n
void SummElements(double **S)
{
    double summ=0;
    for (int i = 0; i < ((int*)S)[0]; i++)
    {
        for (int j = 0; j < ((int*)S)[1]; j++)
        {
            if (i == j)
            {
                summ += S[i + 2][j];
            }
        }
    }
    printf("сумма элементов равна:%lf\n", summ);
}
///функция формирует одномерный массив S2 состоящий из элементов главной диагонали матрицы S
 void FillArray2(double **S, double *S2)
{
    int k = 0;
    for (int i = 0; i < ((int*)S)[0]; i++)
    {
        for (int j = 0; j < ((int*)S)[1]; j++)
        {
            if (i == j)
            {
                S2[k] = S[i + 2][j];
                k++;
            }
        }
 
    }
}
 ///функция сортирует в порядке убывания элементы одномерного массива S2 размера n
 void SortElements(double *S2,double **S)
 {
     int sort;
     double p;
     do
     {
         sort = true;
         for (int i = 0; i <((int*)S)[0]; i++)
         {
             if (S2[i] < S2[i + 1])
             {
                 p = S2[i];
                 S2[i] = S2[i + 1];
                 S2[i + 1] = p;
                 sort = false;
             }
         }
     } while (sort == false);
 }
 ///функция выводит элементы массива S2 на экран
 void PrintArray2(double *S2,double **S)
 {
     for (int i = 0; i < ((int*)S)[0]; i++)
     {
         printf("%lf ", S2[i]);
     }
 }
 
 
 ///функция возвращает указатель на динамически созданный массив из n строк и n столбцов
double ** Creation2D()
{
    int n;
    printf("Введите размеры массива:\n");
    scanf("%d", &n);
    double**S = (double**)malloc(sizeof(double*)*n + sizeof(int) * 2);
    ((int*)S)[0] = n;
    ((int*)S)[1] = n;
    //(int*)S++;
    //(int*)S++;
    for (int i = 0; i < n; i++)
    {
        S[i + 2] = (double*)malloc(sizeof(double)*n);
    }
 
    return S;
}
///функция освобождает память от двухмерного массива S
void FreeCreation2D(double **S)
{
    
    for (int i = 0; i < ((int*)S)[0]; i++)
    {
        free(S[i + 2]);
    }
    free(S);
}
 
int main()
{
    setlocale(0, "");
    double **S = Creation2D();
    int n = ((int*)S)[0];
    double * S2 = (double *)malloc(sizeof(double)*n);
    FillArray(S);
    printf("массив:\n");
    PrintArray(S);
    SummElements(S);
    FillArray2(S, S2);
    printf("элементы главной диагонали в порядке убывания\n");
    SortElements(S2,S);
    PrintArray2(S2,S);
    printf("\n");
    free(S2);
    FreeCreation2D(S);
    system("pause");
}
0
Миниатюры
Работа с динамической памятью  
lss
930 / 859 / 355
Регистрация: 10.10.2012
Сообщений: 2,705
02.04.2015, 20:05 20
Или так:
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
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
///функция формирует квадратную матрицу S размера n*n нужными значениями
void FillArray(double **S)
{
    for (int i = 0; i < ((int*)S)[-1]; i++)
    {
        for (int j = 0; j < ((int*)S)[-2]; j++)
        {
            S[i][j] = log10((double)i + 1 + j);
        }
    }
}
///функция осуществляет вывод матрицы S размера n*n
void PrintArray(double **S)
{
    for (int i = 0; i < ((int*)S)[-1]; i++)
    {
        for (int j = 0; j < ((int*)S)[-2]; j++)
        {
            printf("%lf ", S[i][j]);
        }
        printf("\n");
    }
}
///функция осуществляет сложение элементов главной диагонали матрицы S размера n*n
void SummElements(double **S)
{
    double summ = 0;
    for (int i = 0; i < ((int*)S)[-1]; i++)
    {
        for (int j = 0; j < ((int*)S)[-2]; j++)
        {
            if (i == j)
            {
                summ += S[i][j];
            }
        }
    }
    printf("сумма элементов равна:%lf\n", summ);
}
///функция формирует одномерный массив S2 состоящий из элементов главной диагонали матрицы S
 void FillArray2(double **S, double *S2)
{
    int k = 0;
    for (int i = 0; i < ((int*)S)[-1]; i++)
    {
        for (int j = 0; j <= ((int*)S)[-2]; j++)
        {
            if (i == j)
            {
                S2[k] = S[i][j];
                k++;
            }
        }
 
    }
}
 ///функция сортирует в порядке убывания элементы одномерного массива S2 размера n
 void SortElements(double *S2,double **S)
 {
     int sort;
     double p;
     do
     {
         sort = true;
         for (int i = 0; i < ((int*)S)[-1]; i++)
         {
             if (S2[i] < S2[i + 1])
             {
                 p = S2[i];
                 S2[i] = S2[i + 1];
                 S2[i + 1] = p;
                 sort = false;
             }
         }
     } while (sort == false);
 }
 ///функция выводит элементы массива S2 на экран
 void PrintArray2(double *S2,double **S)
 {
     for (int i = 0; i < ((int*)S)[-1]; i++)
     {
         printf("%lf ",S2[i]);
     }
 }
///функция возвращает указатель на динамически созданный массив из n строк и n столбцов
 double ** Creation2D()
{
    int n;
    printf("Введите размеры массива:\n");
    scanf("%d", &n);
    double**S = (double**)malloc(sizeof(double*)*n + sizeof(int) * 2);
    ((int*)S)[0] = n;
    ((int*)S)[1] = n;
    (int*)S++;
    (int*)S++;
    for (int i = 0; i < n; i++)
    {
        S[i] = (double*)malloc(sizeof(double)*n);
    }
    
    return S;
}
///функция освобождает память от двухмерного массива S
void FreeCreation2D(double **S)
{
    
    for (int i = 0; i <((int*)S)[-1]; i++)
    {
        free(S[i]);
    }
    (int*)S--;
    (int*)S--;
    free(S);
}
 
int main()
{
    setlocale(0, "");
    double **S=Creation2D();
    int n = ((int*)S)[-1];
    double * S2 = (double *)malloc(sizeof(double)*n);
    FillArray(S);
    printf("массив:\n");
    PrintArray(S);
    SummElements(S);
    FillArray2(S, S2);
    printf("элементы главной диагонали в порядке убывания\n");
    SortElements(S2,S);
    PrintArray2(S2,S);
    printf("\n");
    free(S2);
    FreeCreation2D(S);
    system("pause");
}
1
02.04.2015, 20:05
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
02.04.2015, 20:05

Работа с динамической памятью через указатели.
Пишу в Microsoft Visual Studio -&gt;Win32 Console application -&gt;C++. Есть такая...

Строки: работа с динамической памятью, перегруженные конструкторы
Привет! Есть задача: Разработать класс String, который в дальнейшем будет...

Работа с динамической памятью через указатели. Загадочная ошибка.
Программа запускается и нормально исполняется, но в конце появляется ошибка....


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

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

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