C语言中char指针数组与数组指针sizeof计算结果差异问题
问题核心原因:两个变量的类型完全不同
C语言的声明解析遵循运算符优先级规则:数组下标[]的优先级高于解引用*,括号会改变默认结合顺序,两个声明的含义从根上就不一样。
- 对于
char *t1[10];
没有括号改变优先级,t1首先和[10]结合,说明t1本身是长度为10的数组,数组存储的每个元素类型是char*(字符指针)。
从你的运行结果可以判断当前是64位环境,64位系统下任意类型指针的占用大小都是8字节,因此整个数组的总大小为10 * 8 = 80字节。
注意:sizeof是少数不会触发数组名退化为指针的运算符,因此这里拿到的是整个数组的实际占用大小,不是首元素指针的大小。如果把t1作为参数传入函数,在函数内部对形参做sizeof计算只会得到指针的大小8。 - 对于
char(*t2)[10];
括号强制让t2首先和*结合,说明t2本身是一个指针,它指向的目标类型是「长度为10的char类型数组」。
不管指针指向的目标是什么类型,指针本身存储的只是一个内存地址,64位环境下地址长度固定为8字节,因此sizeof(t2)的结果为8。
你可以用下面的代码验证两者的类型差异:
#include <stdio.h> int main() { char *t1[10]; char(*t2)[10]; char test_arr[10] = "test"; t2 = &test_arr; // 合法操作,符合t2的指针类型定义 printf("t1单个元素大小: %zu\n", sizeof(t1[0])); // 输出8,t1[0]是char*类型 printf("t2指向目标的大小: %zu\n", sizeof(*t2)); // 输出10,*t2是长度为10的char数组 return 0; }
内容的提问来源于stack exchange,提问作者Samuel
相关产品推荐
相关产品推荐

