Корзина в оперативной памяти с динамическими массивами - PullRequest
1 голос
/ 11 июля 2019

Я попытался создать алгоритм, который подсчитывает, сколько чисел делится без остатка. Код работает, но каждый раз, когда я запускаю его, я получаю «мусорные» цифры в своем выводе. Я использую динамические массивы для решения проблемы.

#include <iostream>
using namespace std;

 int main() 
 {
    int N = 30;

    int *data = new int [N];

    for (int i = 0; i < 100; i++)
    {
        for (int c = 1; c < N; c++)
        {
            if (i % c == 0)
            {
                data[c] += 1;
             }
         }
     }

     for (int k = 1; k < N; k++)
     {
        cout << data[k] << endl;
     }

     delete [] data;
 }

Я ожидал получить, по крайней мере, то, что говорит C ++ Shell: http://cpp.sh/6xtc

100
50
34
25
20
17
15
13
12
10
10
9
8
8
7
7
6
6
6
5
5
5
5
5
4
4
4
4
4

, но получил в разных IDE один и тот же результат:

100
11932994
34
25
20
17
15
13
12
620757039
37045
11951945
8
11927896
7
7
7290
158
6
5
5
570425383
37040
11951941
4
11927892
4
1835102827
859059803

Ответы [ 2 ]

6 голосов
/ 11 июля 2019

Вы делаете

int *data = new int [N];

И выделить массив N-размера. Затем вы сразу начинаете пытаться увеличивать значения в нем:

data[c] += 1;

Но что там было с самого начала?

Если вы хотите гарантировать, что все значения будут инициализированы равными 0, для этого ответа вы можете выделить свой массив с помощью:

int *data = new int [N]();
//                    ^^^^

<Обязательный "вы должны просто использовать <a href="https://en.cppreference.com/w/cpp/container/vector" rel="noreferrer">std::vector!" комментарий здесь. \>

(Но на самом деле, векторы облегчили бы этот путь и полностью избежали бы этой проблемы)

3 голосов
/ 11 июля 2019
data[c] += 1;

Вы добавляете что-то к неинициализированному значению. data [c] не обязательно был 0 до этого. new не инициализирует динамический массив нулем.

Закройте все новые / удалите и используйте std :: vector <>. И, научитесь использовать отладчик - очень полезно в этом случае.

...