c++ - C++中动态二维数组中的地址

标签 c++ arrays pointers dynamic memory-address

我可以通过以下方式在 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**: %d\n", sizeof(int**));
    printf("the size of int*: %d\n", sizeof(int*));
    printf("the size of int: %d\n\n", sizeof(int));



    printf("%d %d", p[0], p[1]);
    return 0;
}

我使用 gcc 版本 4.7.1 (tdm-1) 编译器并在我的 Windows 10-64 位机器上运行我的程序。

这是一个示例输出:

the size of int**: 4

the size of int*: 4

the size of int: 4

8135000 8135024

所以,这是我的两个问题:

  1. 为什么地址相差 24 而不是 16 (= 4*4)? int 的大小为 4,一行中有 4 列。那么他们不应该相差16吗? 我知道 c++ 结构中的字节填充。是这样的原因吗?

  2. 我尝试将 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?

最佳答案

  1. 内存分配操作的结果是 alignof(std::max_align_t) 对齐的。在你的情况下 alignof(std::max_align_t) 可能是 8。
  2. 在大多数实现中,有不可见数量的 sizeof(std::max_align_t) 字节与数组一起分配用于一些内部簿记。在您的情况下,它的大小可能为 8。

所以在第一种情况下:4*4 + 8 = 24,已经是 8 的倍数。
第二个:4*5 + 8 = 28,四舍五入到最接近的 8 = 32 的倍数。

编译器没有义务返回递增地址或遵循某种模式。碰巧这是您的情况下最简单的事情。

关于c++ - C++中动态二维数组中的地址,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36907963/

相关文章:

c++ - 如何将两种类型的数据分配给一个变量?

c - 在 C 中使用 strtok 将日期字符串转换为整数

c - C/C++中float*和float[n]有什么区别

c++ - OpenMP:通过线程 ID 访问共享变量时是否需要临界区

c++ - 在 C/C++ 中解析二进制消息流

c++ - undefined reference 错误对我没有任何意义

c++ - C++中如何指定模板类实现某些方法?

javascript - 将选中的复选框值及其名称存储在二维数组中

javascript - PHP、HTML JS MySQL 动态下拉菜单

C++静态空指针