快速get sizeof和strlen的区别 !
1.sizeof
在学习操作符的时候,学习了sizeof ,是单目操作符,绝对不是函数!!!
sizeof 计算变量所占内存内存空间大小的,单位是字节,如果操作数是类型的话,计算的是使用类型创建的变量所占内存空间的大小。
sizeof 只关注占用内存空间的大小,不在乎内存中存放什么数据。
举个例子:
#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>int main()
{int a = 10;printf("%d\n", sizeof(a));printf("%d\n", sizeof a);printf("%d\n", sizeof(int));return 0;
}
运行结果:
2.strlen
strlen 是C语言库函数,功能是求字符串长度。函数原型如下:
size_t strlen ( 1 const char * str );
eg:
#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
#include<stdio.h>int main()
{int len = strlen("abcdef");printf("%zd\n", len);return 0;
}
运行结果:
为什么输出的结果是6呢?
因为其统计的是从strlen 函数的参数str 中这个地址开始向后, \0 之前字符串中字符的个数。
strlen 函数会一直向后找\0 字符,直到找到为止,所以可能存在越界查找。
#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
#include<stdio.h>int main()
{int len = strlen("abc\0def");printf("%zd\n", len);return 0;
}
本段代码的运行结果就是3:
不同的写法:
//不同的写法
//int main()
//{
// char str[] = "abcdef";
// printf("%zd\n", strlen(str));
// return 0;
//}int main()
{const char* str = "abcdef";printf("%zd\n", strlen(str));return 0;
}
特别注意一种情况:
//特别注意一种情况
int main()
{char arr[] = {'a','b','c'};printf("%zd\n", strlen(arr));return 0;
}
此时不知道什么时候遇到 \0 ,所以产生一个随机值,运行结果:
3.sizeof 和 strlen 的区别,总结一下
sizeof 和 strlen的对比:
sizeof
1. sizeof是操作符。
2. sizeof计算操作数所占内存的大小,单位是字节。
3. 不关注内存中存放什么数据。
4.sizeof 括号中有表达式的话,表达式是不参与计算的!!!
eg:
//表达式不计算
int main()
{int a = 8;short s = 4;printf("%d\n", sizeof(s = a + 100));//short类型printf("%d\n", s);return 0;
}
short 2个字节
int 4个字节
所以在运行是 int 被截断了
运行结果:
那么,为什么不计算呢?
因为C语言是编译型语言
在 test.c 中:
编译—— 连接 —— test.exe —— 运行
strlen
1. strlen是库函数,使用需要包含头文件(#include<string.h>)。
2. srtlen是求字符串长度的,统计的是\0 之前字符的个数。
3. 关注内存中是否有 \0 ,如果没有 \0 ,就会持续往后找,可能会越界。