Форум программистов, компьютерный форум CyberForum.ru

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
anti-k
227 / 75 / 23
Регистрация: 17.07.2015
Сообщений: 774
Завершенные тесты: 1
#1

Динамическая память массивы - C++

20.08.2015, 09:52. Просмотров 250. Ответов 10
Метки нет (Все метки)

В моем примере создаются 4 массива, в arr2[n] и arr3[n] сохраняются результаты совпадений/ не совпадений соответственно. new int создает массив размером int n, хотя полностью размер не используется, можно ли менять размер динамического массива после его создания и как?
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
#include<iostream>//hometask 2
#include<windows.h>
#include<ctime>
 
using namespace std;
void input(int*,int);
int check_match(int*,int*,int*,int);
int check_no_match(int*,int*,int*,int);
void output(int*,int);
 
int main(){
    const int n=10;
    srand(time(0));
    
    int* arr=new int[n];
    int* arr1=new int[n];
    int* arr2=new int[n]();
    int* arr3=new int[n]();
     
    input(arr,n);
    
    input(arr1,n);  
    
    int l=check_match(arr,arr1,arr2,n);
    cout<<"Array with matches "<<endl;
    output(arr2,l);
    
    int k=check_no_match(arr,arr1,arr3,n);
    cout<<"Array with mismatches "<<endl;   
    output(arr3,k);
   
    
    delete [] arr;
    delete [] arr1;
    delete [] arr2;
    delete [] arr3;
    system("pause");
    
    return 0;
}
void input(int* arr,int n){
    for(int i =0;i<n;i++){
        arr[i]=rand()%n;
        cout<<" "<<arr[i];
    } 
    cout<<endl;
}
 
int check_match(int* arr,int* arr1,int* arr2,int n){
    int size=0,counter=0;
    for(int i=0;i<n;i++){
        for(int k=0;k<i;k++){
            if(arr[k]==arr[i])
            counter++;      
            }
            if(counter==0){
                
                for(int j=0;j<n;j++){
                    if(arr[i]==arr1[j]){                    
                    arr2[size]=arr[i];
                    size++;
                    break;
                    }
                }
                
            }
            
    counter=0;
    }
    return size;
}
 
 
int check_no_match(int*arr,int*arr1,int*arr3,int n){
    int size=0,counter=0,counter1=0;
    for(int i=0;i<n;i++){
        for(int k=0;k<i;k++){
            if(arr[i]==arr[k]){
                counter++;
            }
        }
        if(counter==0){
            for(int j=0;j<n;j++){
                if(arr[i]==arr1[j])
                counter1++;
                
            }
            if(counter1==0){
                arr3[size]=arr[i];
                size++;
            }
            counter1=0;
        }
        
        counter=0;
    }
 
    counter=0;
    counter1=0;
    for(int i=0;i<n;i++){
        for(int k=0;k<i;k++){
            if(arr1[i]==arr1[k]){
                counter++;
            }
        }
        if(counter==0){
            for(int j=0;j<n;j++){
                if(arr1[i]==arr[j])
                counter1++;
                
            }
            if(counter1==0){
                arr3[size]=arr1[i];
                size++;
            }
            counter1=0;
        }
        
        counter=0;
    }
    return size;
}
 
void output(int*arr,int size){
    for(int i=0;i<size;i++){
        cout<<" "<<arr[i];
    }
    cout<<endl;
}
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
20.08.2015, 09:52     Динамическая память массивы
Посмотрите здесь:

Динамическая память и массивы - C++
Всем доброе утро . Решил по практиковаться и задался вопросом у меня есть массив a; как ему динамическую память выделить? как понял...

Массивы и указатели. Динамическая память - C++
Нужно вывести на экран максимальные элементы в каждом столбце двумерного массива (матрицы). Решить с помощью указателей. Ошибка...

Многомерные массивы и динамическая память - C++
Всем привет! Как в С++ динамически выделить двухмерный массив с заданными размерностями, при этом я не хочу использовать доисторический...

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

Динамическая память. Функции. Массивы .Объекты - C++
Всем привет. Возник следующий вопрос: 1.Когда в c++ из функции возвращается объект (экземпляр какого-то класса), то насколько мне...

Динамическая память - C++
Народ, если кому не сложно помогите переделать вот эту программу со структурами нужно сделать так чтобы для хранения данных она...

После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
John Prick
773 / 706 / 129
Регистрация: 27.07.2012
Сообщений: 2,022
Завершенные тесты: 3
20.08.2015, 09:54     Динамическая память массивы #2
Цитата Сообщение от anti-k Посмотреть сообщение
можно ли менять размер динамического массива после его создания и как?
Нет. Можно выделить новый массив с новым размером, копировать в него старый, затем старый удалить.
anti-k
227 / 75 / 23
Регистрация: 17.07.2015
Сообщений: 774
Завершенные тесты: 1
20.08.2015, 10:19  [ТС]     Динамическая память массивы #3
John Prick, очень даже не плохой вариант!! Во всяком случае мне понятный!

Добавлено через 10 минут
John Prick, Подскажите еще вот что, когда именно стоит использовать " встроенную "(inline) функцию, допустим, в моем случае, это уместно?
C++
1
2
3
4
5
inline change(int*arr,int arr1,int n, int m){
    for(int i=0;i<m;i++){
        arr1[i]=arr[i];
    }
}
Байт
Эксперт C
15663 / 9990 / 1499
Регистрация: 24.12.2010
Сообщений: 18,776
20.08.2015, 10:26     Динамическая память массивы #4
Сообщение было отмечено автором темы, экспертом или модератором как ответ
anti-k, Если выделять память через malloc, то изменить размер выделенной памяти можно через realloc

Добавлено через 1 минуту
Но, возможно, в вашем случае лучше использовать vector
John Prick
773 / 706 / 129
Регистрация: 27.07.2012
Сообщений: 2,022
Завершенные тесты: 3
20.08.2015, 10:26     Динамическая память массивы #5
Сообщение было отмечено автором темы, экспертом или модератором как ответ
Цитата Сообщение от anti-k Посмотреть сообщение
когда именно стоит использовать " встроенную "(inline) функцию
Умные люди говорят, что использовать inline нужно только тогда, когда будет наверняка известно, что так необходимо делать. Например, профайлер покажет, что вызов этой функции происходит гораздо более медленно, чем если бы код её был встроенным. Ну и т.д.
anti-k
227 / 75 / 23
Регистрация: 17.07.2015
Сообщений: 774
Завершенные тесты: 1
20.08.2015, 11:17  [ТС]     Динамическая память массивы #6
Байт, Здравствуйте!! Спасибо! Почитаю реализацию malloc.

Добавлено через 48 минут
Байт, при введении небольшого числа, до 10
Process exited after 3.613 seconds with return value 0

в случае если больше, ошибка выполнения
Process exited after 7.556 seconds with return value 255
массив рисует но программу прикрывает.
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
#include<iostream>
#include<cstdlib>
 
using namespace std;
 
int main(){
    int n;
    cin>>n;
    int* arr=(int*) malloc(n);
    for(int i=0;i<n;i++){
        arr[i]=1;
        cout<<" "<<arr[i];
    }
    free(arr);
    return 0;
}
castaway
Эксперт С++
4881 / 3017 / 370
Регистрация: 10.11.2010
Сообщений: 11,076
Записей в блоге: 10
Завершенные тесты: 1
20.08.2015, 11:20     Динамическая память массивы #7
Сообщение было отмечено автором темы, экспертом или модератором как ответ
C++
1
malloc( n * sizeof( int ) );
Функция malloc принимает размер в байтах.
anti-k
227 / 75 / 23
Регистрация: 17.07.2015
Сообщений: 774
Завершенные тесты: 1
20.08.2015, 11:36  [ТС]     Динамическая память массивы #8
castaway, Мое почтение! Ясность 100%
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
#include<iostream>
#include<cstdlib>
 
using namespace std;
 
int main(){
    int n;
    cin>>n;
    int* arr= (int*)malloc(n*sizeof(int));
    for(int i=0;i<n;i++){
        arr[i]=1;
        cout<<" "<<arr[i];
    }
    free(arr);
    return 0;
}
Добавлено через 4 минуты
castaway, а как объяснить что до 10 все чикает и return value 0; Я так понимаю что происходит перебор в выделенной памяти, при чем относительно размера самого массива большой(в 4 раза!)
castaway
Эксперт С++
4881 / 3017 / 370
Регистрация: 10.11.2010
Сообщений: 11,076
Записей в блоге: 10
Завершенные тесты: 1
20.08.2015, 11:39     Динамическая память массивы #9
Цитата Сообщение от anti-k Посмотреть сообщение
castaway, а как объяснить что до 10 все чикает и return value 0;
Видимо до 10 значений программа не затирала критически важные участки памяти. Просто повезло.
anti-k
227 / 75 / 23
Регистрация: 17.07.2015
Сообщений: 774
Завершенные тесты: 1
20.08.2015, 11:59  [ТС]     Динамическая память массивы #10
castaway, Посмотрите пожалуйста все ли здесь четко
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
#include<iostream>
#include<cstdlib>
 
using namespace std;
 
int main(){
    int n;
    cin>>n;
    int m;
    cin>>m;
    int* arr= (int*)malloc(n*sizeof(int));
    for(int i=0;i<n;i++){
        arr[i]=i;
        cout<<" "<<arr[i];
    }
    cout<<endl; 
    arr=(int*)realloc(arr,m*sizeof(int));
    for(int i=0;i<m;i++)
    cout<<" "<<arr[i];
    cout<<endl;
    free(arr);
    return 0;
}
Добавлено через 2 минуты
и почему в этом случае ошибка выполнения. рисует массив первые три значения мусор, остальные совпадают. Затем закрывает программу.Потому что для arr1 не выделил память malloс-ом?
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
#include<iostream>
#include<cstdlib>
 
using namespace std;
 
int main(){
    int n;
    cin>>n;
    int m;
    cin>>m;
    int* arr= (int*)malloc(n*sizeof(int));
    for(int i=0;i<n;i++){
        arr[i]=i;
        cout<<" "<<arr[i];
    }
    cout<<endl;
    int*arr1=NULL;
    arr1=(int*)realloc(arr,m*sizeof(int));
    free(arr);
    for(int i=0;i<m;i++)
    cout<<" "<<arr1[i];
    cout<<endl;
    free(arr1);
    return 0;
}
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
20.08.2015, 15:41     Динамическая память массивы
Еще ссылки по теме:

Динамическая память - C++
Добрый вечер! Возникла у меня такая проблемка, нужно от статической памяти перейти к динамической. То ли уже голова не варит, то ли руки не...

Динамическая память - C++
Как создать массив A через динамическую память ???

Указатели и динамическая память - C++
Здравствуйте. Почему размер памяти для указателя выделяется такой же как для объекта в куче. Например: int * pVar = new int;Как я понял,...

malloc и new (динамическая память) - C++
Ребят, привет. ОЧчень интересует вопрос с динамической памятью . Как эта штука реализованна внутри ? я понимаю, что процессу выделяется в...


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

Или воспользуйтесь поиском по форуму:
castaway
Эксперт С++
4881 / 3017 / 370
Регистрация: 10.11.2010
Сообщений: 11,076
Записей в блоге: 10
Завершенные тесты: 1
20.08.2015, 15:41     Динамическая память массивы #11
Во втором коде строка free(arr); не нужна, т.к. указатель arr уже не указывает на свободный блок памяти после вызова realloc.
Yandex
Объявления
20.08.2015, 15:41     Динамическая память массивы
Ответ Создать тему
Опции темы

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