C语言中的sizeof和strlen
在C语言中,sizeof一般用来计算数组的长度,或者数据类型的长度。
strlen:运行期从起始地址开始逐字节扫描,遇到第一个 '\0' 就停止,返回的是“首个终止符之前的字节数”,不包含 '\0'。
sizeof:编译期(对类型/对象)或运行期常量表达式求对象“所占总大小(字节数)”,不做扫描;对字符串字面量或真实数组得到的是“数组全部容量”,包含结尾自动添加的那个 '\0';对指针得到的是指针本身大小(4 或 8 字节),与指向内容无关。
所以,只有 strlen 具有“遇到 '\0' 结束”的扫描语义;sizeof 没有这一过程。两者的结果常常不同。
strlen("ABC") == 3
strlen("A\0B") == 1 // 中间 '\0' 截断
strlen("") == 0sizeof("ABC") == 4 // 'A','B','C','\0'
sizeof("A\0B") == 4 // 字面量里包含 'A','\0','B' + 末尾自动再加 '\0'对于已定义的数组
char a[] = "ABC";
sizeof(a) == 4
strlen(a) == 3对指针变量:
char *p = "ABC";
sizeof(p) // 指针大小:4(32位)/8(64位)
strlen(p) == 3 // 运行期扫描 p 指向的那段