在C ++中的指针数组中,内存过量使用会导致指针存储在非连续的内存块中吗?

时间:2016-10-07 04:56:16

标签: c++ c arrays pointers memory

我在XCode中编写了一些代码,当我部分填充数组时发现了一些有趣的东西。我的代码基本上是这样的(这只是为了简单起见的一个例子):

#include <iostream>
using namespace std;

int main(){
    int** array = new int*[20];
    for(int k = 0; k < 20; k+=3){
        array[k] = &k;
    }

    for(int k = 0; k < 20; k++){
        bool ptrVal = (array[k] == nullptr);
        cout << k << ": " << ptrVal << endl;
    }
}

这段代码最终打印出来:

0: 0
1: 0
2: 0
3: 0
4: 0
5: 0
6: 0
7: 1
8: 1
9: 0
10: 1
11: 1
12: 0
13: 1
14: 1
15: 0
16: 1
17: 1
18: 0
19: 1

我在期待这个:

0: 0
1: 1
2: 1
3: 0
4: 1
5: 1
6: 0
7: 1
8: 1
9: 0
10: 1
11: 1
12: 0
13: 1
14: 1
15: 0
16: 1
17: 1
18: 0
19: 1

之后我读了下面关于操作系统如何过度使用内存的文章: C++ memory allocation for an array of pointers

操作系统是否故意为已部分填充的指针数组分配非连续内存块?如果是这样,为什么会这样做,以及我的示例代码中显示结果的原因是什么?

2 个答案:

答案 0 :(得分:2)

你有:

int** array = new int*[20];
for(int k = 0; k < 20; k+=3){
    array[k] = &k;
}

之后,k[1], k[2], [k4], k[5] ..保持未初始化状态。它们未被分配指针的行设置为nullptr

结果就行了,

    bool ptrVal = (array[k] == nullptr);

导致未定义的行为。

您可以在分配时使用以下内容使指针等于nullptr

int** array = new int*[20]{};

答案 1 :(得分:1)

您假设未初始化的数组元素设置为0.它们不是。 如果你添加

    memset(array, 0, sizeof(*array)*20);

在第一个循环之前,您的输出将是您所期望的。