C++中使用new分配内存是否为连续分配?动态数组地址疑问
关于动态分配数组内存地址的误区
你的理解存在错误,不管是堆上动态分配的数组还是栈上的数组,元素的内存地址都遵循连续存储、按类型大小间隔的规则:
- 对于代码
int* ptr = new int[5];,&ptr[0]是数组第一个元素的地址,&ptr[1]必然等于&ptr[0] + sizeof(int)(也就是你例子中的0x7fffa07f7564,因为int通常占4字节)。这是C++标准明确规定的,堆上的数组元素同样是连续存储的。 - 你所说的“内存地址随机”,指的是数组整体的起始地址可能是随机的(比如堆分配的起始地址每次运行程序可能不同,栈上数组的起始地址也会受栈空间使用情况影响),但数组内部元素的地址一定是连续且按元素类型的字节数递增的。
- 栈上的
int array[5];和堆上的new int[5],在数组元素的内存布局上没有本质区别,都是连续的内存块,每个元素间隔sizeof(int)字节。
内容的提问来源于stack exchange,提问作者petat_irrumator
相关产品推荐
相关产品推荐

