首先我们先来看strlen和sizeof的区别
strlen:是计算字符个数,不包括’\0’
sizeof:计算所占内存空间,包含’\0’
#include<stdio.h>
#include<string.h>
int main() {
char arr[7] = "abcdef";
printf("strlen:%d\n", strlen(arr));
printf("sizeof:%zu\n", sizeof(arr));
注意点1.
sizeof不是库函数,是操作符!,strlen是库函数。
库函数必须加(),如:main(){},printf()等。
所以sizeof格式可以不加(),如:sizeof a等价于sizeof(a),其中a是变量。
注意点2.
sizeof(int)//ok
sizeof int //err
这里会有一个问题为什么int是错误的?
原因是因为当sizeof放类型时,不能省略().
注意点3.
%zu是专门用来打印sizeof()的返回
第一想法为什么数组越界还能打印出来呢?
原因是因为sizeof并不会去访问这个元素,而是通过arr类型判断出他的大小。
sizeof(arr),是计算整个数组的大小,前提()中为数组名。
sizeof(arr),此时arr为整个数组的地址,&arr也是整个数组的地址。
以上是两种特殊情况,其余情况arr均为首元素的地址
sizeof中的表达式不会进行运算,根据a计算大小。
fun函数中因为传送的是arr数组名首元素的地址,所以是4 。
而main函数中sizeof(arr)是整个数组的地址,所以为20。