首页 > 解决方案 > 对于每行具有不同列大小的矩阵的动态内存分配会发生什么?

问题描述

我正在尝试在 C++ 中创建一个矩阵,具有如下三角形:

n = 行数;例如,如果我输入 n = 4,我的矩阵应如下所示:1 23 456 78910

我已经设法执行以下代码:

int n;
cout << "Introduceti n: ";
cin >> n;
int** a = new int*[n];
for (int i = 0; i < n; i++) {
    a[i] = new int[i+1];
}

for (int i = 0; i < n; i++) {
    for (int j = 0; j < i+1; j++) {
        *(*(a + i) + j) = (i * i + i) / 2 + j +1;
    }
}


for (int i = 0; i < n; i++) {
    for (int j = 0; j < i+1; j++) {
        cout << *(*(a + i) + j) << "|";
    }
    cout << endl;
}

问题是:为什么我可以访问 a[0][1] 并显示一个值,如果我指示我的指针停止在 a[0][0] 处初始化?

标签: c++arraysmatrixmemorydynamic

解决方案


您可以访问内存,无论它是被初始化还是分配。您可以编写代码来避免那些可能不需要的事件,或者有适当的机制来检测它们。

所以,

为什么我可以访问 [0][1]...
如上所述

...它向我展示了一个价值,...
因为内存中的每一位都有一些价值。

试试下面的代码,你可能会明白你在做什么。

您可以占用的最少内存是确保您具有连续分配。因此,您宁愿在线性数组中为 (n*(n+1)/2) 个整数(三角矩阵的大小)分配存储空间,然后简单地定义用于访问元素 (i,j) 的函数/宏。可能需要不超过 20 行代码...如果您想确保安全工作,您可以包含一些检查以获取更多行。

#include <iostream>

using namespace std;

int main() {
    int n;
    cout << "Introduceti n: ";
    cin >> n;
    int **a = new int*[n];
    for (int i = 0; i < n; i++) {
        a[i] = new int[i + 1];
    }

    cout << "Size of int is " << sizeof(int) << endl;

    for (int i = 0; i < n; i++) {
        for (int j = 0; j < i + 1; j++) {
            *(*(a + i) + j) = (i * i + i) / 2 + j + 1;
        }
    }

    for (int i = 0; i < n; i++) {
        for (int j = 0; j < i + 1; j++) {
            cout << *(*(a + i) + j) << "|";
        }
        cout << endl;
    }

    cout << "a[0][0] @" << &(a[0][0]) << "=" << a[0][0] << endl;
    cout << "a[0][1] @" << &(a[0][1]) << "=" << a[0][1] << endl;

    return 1;
}

推荐阅读