C++ 中动态二维数组中的地址
address in dynamic two dimensional array in c++
我可以通过以下方式在 c++ 中创建一个二维数组。但是我无法理解内存寻址。
(请注意我代码的最后一行,我尝试打印内存位置的十进制值。
#include <cstdio>
#include <iostream>
using namespace std;
#define rowSize 3
#define colSize 4
int main(){
int ** p;
p = new int*[rowSize];
for(int i = 0; i < rowSize; i++){
p[i]= new int[colSize];
}
printf("the size of int**: %dn", sizeof(int**));
printf("the size of int*: %dn", sizeof(int*));
printf("the size of int: %dnn", sizeof(int));
printf("%d %d", p[0], p[1]);
return 0;
}
我使用了 gcc 版本 4.7.1 (tdm-1) 编译器,并在我的 Windows 10- 64 位机器上运行我的程序。
下面是一个示例输出:
整数的大小**:4
整数*的大小:4
整数大小:4
8135000 8135024
所以,这是我的两个问题:
为什么地址相差 24 而不是 16 (= 4*4) ?int 的大小为 4,一行有 4 列。那么它们不应该相差 16 吗?我知道 c++ 结构中的字节填充。这样的事情是背后的原因吗?
我尝试将 colSize 更改为 5:
#define colSize 5
并重新编译并再次运行该程序。示例输出:
the size of int**: 4 the size of int*: 4 the size of int: 4 7151960 7151992
这次的地址相差32个。如果字节填充是原因,则 5 列将需要 5*4 = 20 字节。在这种情况下,填充 4 个字节就足够了,在这种情况下,地址也应该相差 24
。那么为什么在这种情况下它们相差 32 呢?
- 内存分配操作的结果
alignof(std::max_align_t)
对齐。在您的情况下,alignof(std::max_align_t)
可能是 8。 - 在大多数实现中,有不可见的
sizeof(std::max_align_t)
字节与数组一起分配,用于某些内部簿记。在您的情况下,它的大小可能为 8。
所以在第一种情况下:4*4 + 8 = 24,已经是 8 的倍数。
秒:4*5 + 8 = 28,四舍五入到最接近的乘数 8 = 32。
编译器没有义务返回增加地址或遵循某种模式。碰巧这是您最容易做的事情。
p[i]
arryas 单元格中的地址由 new
运算符定义
p[i]= new int[colSize];
此运算符可以从堆中返回任何地址,这与数组大小无关。
您可以创建一个大的一维数组(正如编译器array[][]
所做的那样)并将二维映射到一个维度。
int* arr2d = new int[colSize*rowSize];
//Retrieve value from Row3 Col2
int nRow3Col2 = arr2d[2 + 3 * colSize];
你写的不是C++而是C。当您将其标记为C++时,我假设您想要C++...
现代C++使用 RAII,并通过使用库标准容器大大简化了事情的排序。虽然我知道这不是你问题的答案,但我建议你重写你的代码:
#include <vector>
#include <cstdio>
int main()
{
int rowsize = ...;
int colsize = ...;
// allocating
std::vector<std::vector<int>> vec(rowsize);
for( auto e: vec )
e.resize(colsize);
// filling with values
vec.at(row).at(col) = 123;
// printing values
std::cout << vec.at(row).at(col) << std::endl;
}
- 将数组的地址分配给变量并删除
- 空基优化子对象的地址
- 动态获取 esp32 的 mac 地址并在以太网库中使用它.
- 给定特定内存地址的数组的动态内存分配
- 在 C++ 中交叉动态分配的二维数组时的侵入性值/地址
- 获取要在C++中动态调用的回调函数的地址
- 地址清理器和运行时加载动态库 ->(<未知模块>)
- 是否可以根据C/C 代码上的Linux上的(动态更改的IP地址集)丢弃传入数据包
- 给定内存地址的内存动态初始化
- 在动态分配时,在免费存储上指向一个新地址是一种好的做法吗
- C++ 中动态二维数组中的地址
- 在Linux上,静态变量和全局变量在动态库和静态库中显示不同的地址
- c++对象的动态地址重定位
- 未定义的引用,但(动态)库被链接.(可能是坏的重定位地址错误)
- 执行free()操作符从动态变量中删除地址
- 动态数组地址
- 正在获取类成员变量(非动态)的内存地址
- C++ 在另一个进程中动态更改地址
- 关于基对象和派生对象的动态强制转换和地址
- 动态数组改变内存地址位置