c ++

时间:2016-04-28 07:23:17

标签: 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位机器上运行我的程序。

以下是示例输出:

  

int **的大小:4

     

int *的大小:4

     

int的大小:4

     

8135000 8135024

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

  1. 为什么地址相差24而不是16(= 4 * 4)? int的大小为4,并且连续有4列。所以他们不应该相差16岁吗? 我知道c ++中结构中的字节填充。这样的事情背后的原因是什么?

  2. 我尝试将colSize更改为5:

    #define colSize 5并重新编译并再次运行该程序。

    示例输出:

  3. 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?

3 个答案:

答案 0 :(得分:3)

  1. 内存分配操作的结果是alignof(std::max_align_t) - 已对齐。在你的情况下,alignof(std::max_align_t)可能是8。
  2. 在大多数实现中,对于某些内部簿记,在数组旁边分配了一个不可见的sizeof(std::max_align_t)个字节。在你的情况下,它的大小可能是8。
  3. 所以在第一种情况下:4 * 4 + 8 = 24,已经是8的倍数 在第二个:4 * 5 + 8 = 28,四舍五入到最接近的乘数8 = 32.

    编译器没有义务返回增加的内容或遵循某种模式。事实上,在你的情况下这是最简单的事情。

答案 1 :(得分:1)

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

答案 2 :(得分:-1)

您不是在编写C ++而是C.在您将其标记为C ++时,我假设您需要C ++ ......

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