【发布时间】:2016-04-28 07:23:16
【问题描述】:
我可以通过以下方式在 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
所以,这是我的两个问题:
为什么地址相差 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?
【问题讨论】:
-
您期望得到什么样的答案?解释 gcc 的实现细节?或者“问题的提出方式是那些不确定的 impl.details,你不应该对它们做出预测;但是如果你必须依赖 X 和 Y,使用这个......”就足够了吗?跨度>
-
用真正的二维数组试试同样的方法:int p[3][4];
-
是的,那么可以计算它们的差异。但我更感兴趣的是了解
new int[colSize]是否以某种模式返回地址。
标签: c++ arrays pointers dynamic memory-address