🎈个人主页👉:tbRNA-CSDN博客
💯个人简介:在校23级大学生一枚💋.
😍希望我的文章对大家有着不一样的帮助,欢迎大家关注我,感谢大家的多多支持!🎉欢迎 👍点赞✍评论⭐收藏
目录
一、sizeof
sizeof 计算变量所占内存内存空间⼤⼩的,单位是字节,如果操作数是类型的话,计算的是使⽤类型创建的变量所占内存空间的⼤⼩。
#inculde <stdio.h>
int main()
{
int a = 10;
printf("%d\n", sizeof(a)); //4个字节
printf("%d\n", sizeof a); //从这里可以看出sizeof属于操作符而不是函数
printf("%d\n", sizeof(int)); //4个字节
return 0;
}
由上面的例子可以看出 :
🥰 sizeof 只关注占⽤内存空间的⼤⼩,不在乎内存中存放什么数据
二、strlen
strlen 是C语⾔库函数,功能是求字符串⻓度。
函数原型如下👇:
size_t strlen ( const char * str );
⭕ 统计的是从 strlen 函数的参数 str 中这个地址开始向后,\0 之前字符串中字符的个数.
⭕ strlen 函数会⼀直向后找 \0 字符,直到找到为⽌,所以可能存在越界查找。
#include <stdio.h>
int main()
{
char arr1[3] = {'a', 'b', 'c'};
char arr2[] = "abc";
printf("%d\n", strlen(arr1)); //未找到'\0',生成随机数.
printf("%d\n", strlen(arr2)); //结果为3
return 0;
}
三、sizeof 与 strlen 的区别
sizeof | strlen |
sizeof 是操作符 | strlen 是库函数,使⽤需要包含头⽂件 string.h |
sizeof 计算操作数所占内存的 ⼤⼩,单位是字节 | srtlen 是求字符串⻓度的,统计的是 \0 之前字符的个数 |
不关注内存中存放什么数据 | 关注内存中是否有 \0 ,如果没有 \0 ,就会持续往后找,可能会越界 |
四、拓展(数组与指针)
4.1 sizeof 拓展
#include <stdio.h>
int main()
{
int arr[] = { 1,2,3,4,5 };
printf("%d\n", sizeof(arr)); //sizeof()中只有数组名时指整个数组,结果为4 * 5 = 20
printf("%d\n", sizeof(arr[0])); //结果为4
printf("%d\n", sizeof(arr + 1)); //arr这里指首元素地址,+1指向下一个元素的地址
//只要sizeof(地址),结果就是4 (32位)/8 (64位)
printf("%d\n", sizeof(&arr + 1)); //&arr + 1指跳过整个arr数组后指向的地址
//只要sizeof(地址),结果就是4 (32位)/8 (64位)
return 0;
}
由上面的例子可以看出 :
⭕ 取到 arr 整个数组只有两种情况
1. sizeof ( ) 中只有数组名时指整个数组
2. &arr 可以取到 arr 整个数组
⭕ 只要 sizeof(地址),结果就是4(32位) / 8(64位)
4.2 strlen 拓展
#include <stdio.h>
#include <string.h>
int main()
{
const char* p = "abcdef";
printf("%d\n", strlen(&p)); //取指针地址也是从首元素开始向右寻找'\0',结果为6
printf("%d\n", strlen(&p + 1)); //&p + 1指跳过一整个数组,结果为随机值
printf("%d\n", strlen(p + 1)); //p + 1指从第二个元素开始向右寻找'\0',结果为5
return 0;
}
4.3 sizeof 与二维数组
🥰举一个简单的二维数组的例子👇(二维数组看成由一维数组组成 )
#include <stdio.h>
int main()
{
int a[3][4] = { {1,2,3,4},{5,6,7,8},{9,10,11,12} };
printf("%d\n", sizeof(a[3])); //结果为4 * 4 = 16
return 0;
}
由上面例子可以得到👇:
🥰 sizeof(a[3]) 越界了但是不影响计算长度,相当于去计算sizeof(int[4]),a[3] 无需真实存在,仅仅通过类型的推断就能算出长度.
总结
sizeof ( ) 操作符
⭕ sizeof 只关注占⽤内存空间的⼤⼩,不在乎内存中存放什么数据
⭕ sizeof 计算操作数所占内存的 ⼤⼩,单位是字节
⭕ sizeof 括号内不支持运算,只关注数据类型
strlen ( ) 函数
⭕ strlen 是库函数,使⽤需要包含头⽂件 string.h
⭕ srtlen 是求字符串⻓度的,统计的是 '\0' 之前字符的个数