c++ - 在 C++ 中的指针数组中,内存过度使用是否会导致指针存储在非连续的内存块中?

标签 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

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

最佳答案

你有:

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]{};

关于c++ - 在 C++ 中的指针数组中,内存过度使用是否会导致指针存储在非连续的内存块中?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39909669/

相关文章:

c++ - std::promise<T> 其中 T 在 Visual Studio 2017 中必须是默认可构造的?

c++ - 模板化无分支 int 最大/最小函数

c++ - 在 C++ 中解释类型为 'int' 的递归函数的返回值

javascript - 如何使Typescript识别递归类型而不落在字符串上

arrays - 查找数组中所有元素实例的索引

c++ - 串口打开返回EAGAIN

C 判断链表中是否存在某个值

c - *(int *)0 ='X' 生成什么信号;

c - 以宽字符作为索引的全局 C 数组

c++ - 带有空白 C++ 的移印线