如何通过指向数组的指针计算数组大小?C语言示例原理详解
C语言指向数组的指针解引用后sizeof计算数组大小的原理
你的示例代码如下:
int main() { int (*ptr)[2][3]; printf("%u\n", sizeof(ptr)); // 输出指针大小,64位环境下为8 printf("%u\n", sizeof(*ptr)); // 输出数组大小,int为4字节时为24 return 0; }
核心规则说明
sizeof是编译期运算符(除变长数组场景外),仅推导操作数的类型并计算该类型的内存占用,不会实际执行运行期的解引用操作,哪怕指针未初始化也不会出现内存访问错误。- 你定义的
int (*ptr)[2][3];中,ptr的类型明确为「指向int[2][3]类型二维数组的指针」:- 指针类型的大小由系统位数决定,64位系统下所有指针的大小都是8字节,因此
sizeof(ptr)输出8 - 对指针解引用得到的
*ptr,类型就是指针指向的int[2][3]数组类型,该数组的总大小计算规则为数组元素个数 × 单个元素大小,也就是2×3 × sizeof(int),若当前环境int占4字节,总大小就是2×3×4=24,因此sizeof(*ptr)输出24
- 指针类型的大小由系统位数决定,64位系统下所有指针的大小都是8字节,因此
额外补充:数组退化规则的例外
很多人疑惑为什么这里解引用得到数组后没有退化为指针,这是因为C标准明确规定:当数组类型作为sizeof、&等运算符的操作数时,不会触发「数组退化为首元素指针」的规则,会保留完整的数组类型,因此sizeof可以直接计算出整个数组的内存占用。
你可以用普通数组做对比:如果定义int arr[2][3];,sizeof(arr)的结果也会是24,和sizeof(*ptr)的结果完全一致,因为二者的类型都是int[2][3]。
内容的提问来源于stack exchange,提问作者Milan
相关产品推荐
相关产品推荐

