带有动态数组的操作内存中的垃圾箱

Trash in operating memory with dynamic arrays

本文关键字:内存 垃圾箱 操作 动态 数组      更新时间:2023-10-16

我尝试制作一种算法,该算法计算有多少数字被除以而没有余数。代码有效,但每次运行它时,我的输出中都会收到"垃圾"数字。我正在使用动态数组来解决问题。

#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++所说的: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

你这样做

int *data = new int [N];

并分配一个 N 大小的数组。然后,您立即开始尝试递增其中的值:

data[c] += 1;

但是一开始是什么呢?

如果要保证所有值都将初始化为 0,根据此答案,您可以使用以下命令分配数组:

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

<必须在此处评论"你应该只使用std::vector!"。\>

(但实际上,矢量会使这种方式更容易并完全避免这个问题(

data[c] += 1;

您向未初始化的值添加了一些内容。 在此之前,data[c] 不一定是 0。 new 不会将动态数组初始化为零。

退出所有新建/删除并使用 std::vector<>。而且,一定要学习使用调试器 - 在这种情况下真的很有帮助。