c++ - 对于每行具有不同列大小的矩阵的动态内存分配会发生什么?
问题描述
我正在尝试在 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] 处初始化?
解决方案
您可以访问内存,无论它是被初始化还是分配。您可以编写代码来避免那些可能不需要的事件,或者有适当的机制来检测它们。
所以,
为什么我可以访问 [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;
}
推荐阅读
- c++ - 将可选属性表示为 C++ 类成员
- r - 使用 Dplyr 过滤超过 3 个级别的因子时出现错误消息
- symfony - 在 createForm (Symfony 2) 中插入实体
- java - 将用户相关数据注入 REST API 方法
- javascript - 在 MongoDB 中每 10 秒检查一次所有数据
- javascript - 我如何从 mysql 获取数据并使用 nodejs 和 javascript 呈现它?
- c - How to print the path to the place where program was compiled in c
- regex - 正则表达式以针对 workbox.routing / service worker 文件夹及其子文件夹中的所有文件
- apache-kafka - kafka客户端使用log4j通信
- python - 为什么我的 stacksize 函数返回 NONE