new 为数组开辟内容空间的时候,数组大小这个额外的信息是如何存储的? int * p = new int[5]; 指针p 指向的的int 数据地址还是数组大小的地址?
在C++中,使用new int[5]动态分配数组时,数组大小的存储方式和指针指向的地址如下:
1. 数组大小的存储机制
编译器会在分配的内存块头部额外存储数组长度等元信息(通常位于实际数组元素内存之前),这部分对程序员透明。具体实现方式由编译器决定,可能通过隐藏的头部字段记录分配大小,但标准未明确规定存储格式。
2. 指针p的指向
int p = new int[5]中,指针p直接指向数组第一个元素的地址(即&p[0]),而非存储数组大小的元数据地址。数组访问通过指针算术运算实现,如p[i]等价于(p + i)。
3. 关键区别
数组名是常量指针(如int arr[5]),其类型包含数组长度信息(int[5]),而p仅是int*类型指针。 sizeof(数组名)返回整个数组字节数,而sizeof(p)返回指针本身大小(4或8字节)。 动态分配的数组需手动释放(delete[] p),编译器依赖隐藏的元信息确定释放范围。
4. 内存布局示例
[元数据][p[0]][p[1]]...[p[4]]
↑ ↑
隐藏区域 p实际指向这里
此布局中,程序员仅能访问p指向的元素区域,元数据由内存管理器内部处理。
问题思考:
1. 数组中元数据应该是什么数据类型 ? 目前我们可以通过指针p[] 来访问数据元素,有办法访问到元数据吗?
2. 数组和动态数组释放的时候,是如何获取到元数据的内容的?