提问者:小点点

对于每行列大小不同的矩阵,动态内存分配会发生什么?


我试着用C++创建一个矩阵,它有一个三角形的形状,像这样:

n=行数; 例如,如果我输入n=4,我的矩阵应该是这样的:1 23 456 789 10

我成功地完成了以下代码:

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

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


共1个答案

匿名用户

您可以访问内存,无论它是初始化的还是分配的。 由您编写代码来避免那些可能不想要的事件,或者建立相应的机制来检测它们。

所以,

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

。。。并且它向我显示了一个值,。。。
因为内存中的每一位都有一些值。

试试下面的代码,您大概就会明白自己在做什么了:

#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;
}