Работа с динамической памятью. При выводе значений массива , иногда все в норме, а иногда в значениях мусор. В чем причина?
/* Даны два массива: А[M] и B[N] (M и N вводятся
с клавиатуры). Необходимо создать третий массив
минимально возможного размера, в котором нужно
собрать элементы массива A, которые не включаются
в массив B*/
#include <iostream>
using namespace std;
int main() {
srand(time(NULL));
setlocale(LC_ALL, "rus");
int a, b;
cout << "Введите размер первого массива: ";
cin >> a;
cout << "Введите размер второго массива: ";
cin >> b;
system("cls");
int* arr = new int[a]; // создание первого массива с динамической памятью
int* arr2 = new int[b];// создание второго массива с динамической памятью
for (int i = 0; i < a; i++) // вывод 1-го массива
{
arr[i] = rand() % 10;
cout << arr[i] << " ";
}
cout << " - ПЕРВЫЙ МАССИВ." << endl << endl;
for (int i = 0; i < b; i++) // вывод 2-го массива
{
arr2[i] = rand() % 10;
cout << arr2[i] << " ";
}
cout << " - ВТОРОЙ МАССИВ." << endl << endl;
int* count = new int(0); // создание счетчика с динамической памятью
int* arr3 = new int[*count]; // создание третьего массива размерностью счетчика
for (int i = 0; i < a; i++)
{ // проход по двум массивам
for (int j = 0; j < b; j++)
{
if (arr[i] != arr2[j]) { // сравниваем равенства элементов двух массивов
if (b == j + 1 && arr[i]!=arr2[j]) {
*count += 1;
arr3[i] = arr[i];
cout <<"Уникальное число - "<< arr3[i] << endl;
break;
}
continue;
}
else if (arr[i] == arr2[j]) {
break;
}
}
}
cout << endl << endl;
for (int i = 0; i < *count; i++) // Массив через раз выводит верно уникальные числа верно, а иногда выводит мусор. В чем причина(?????)
{
cout << arr3[i]<<" ";
}
cout << " - ТРЕТИЙ МАССИВ";
delete[] arr;
delete[] arr2;
delete[] arr3;
delete count;
return 0;
}
Ответы (2 шт):
Что-то вы странное делаете...
Создайте третий массив целых чисел такой же размерности, как первый (a).
int* arr3 = new int[a];
int cnt = 0;
for (int i = 0; i < a; i++) {
int use = 1;
for (int j = 0; j < b; j++)
if (arr[i] == arr2[j]) {
use = 0;
break;
}
if (use) {
arr3[cnt++] = arr[i];
cout <<"Уникальное число - "<< arr[i] << endl;
}
}
Теперь создайте новый массив длиной cnt и скопируйте в него cnt элементов arr3
Понимаете, при создании массива
int* arr3 = new int[*count];
память выделяется один раз. Так что у вас arr3 - указатель на 0 байт...
Ну как если бы вас мужики попросили притащить ящик пива. Вы на бумажке (переменная count) написали, скажем, "2 бутылки" (ну, 0 - очень уж смешно бы выглядело...), в магазине (менеджере памяти) показали бумажку, и попросили продать то, что написано. Вам дали это пиво, вы его принесли, достали бумажку, и исправили 2 на 20. После чего смотрите на свою покупку - а там почему-то так и остаются 2 бутылки пива, а не 20...
Эта ситуация не заставляет вас спрашивать - в чем причина? Почему мужики рассердились, пытаясь пить третью, четвертую, пятую бутылки пива? :)