C语言中的strlen()和sizeof()对比分析
qq_44976409 人气:0C语言中的strlen()和sizeof()对比
在C语言中,没有字符串这种变量类型,一般用两种方法实现。
一是用双引号生成常量字符串再赋值给一个指针,指针指向的是该常量字符串的首字符地址;
二是利用字符数组,把字符存储在数组中。值得注意的是,利用字符数组创建字符串的时候记得把’\0’存进去(‘\0’本身是一个字符,占一个字节),因为很多对字符进行操作的库函数或多或少都跟’\0’有关系,或者说’\0’是字符串结束的官方标志。
字符串 char arr[]={'a','a','a','a','a','a'} char *str = "aaaaaa"
定义:
**1. strlen函数:**计算的是字符串str的长度,从字符的首地址开始遍历,以 ‘\0’ 为结束标志,然后将计算的长度返回,计算的长度并不包含’\0’。
当我们遇到“\0"时我们就要停止读取,此时“\0"前字符的个数就是字符串的长度,注意:这里的“\0"只是结束标志,仅仅告诉我们strlen函数读取到这里就要停止了,“\0"不算做一个字符!!!
**2. sizeof函数:**相比strlen函数,sizeof就简单多了,sizeof其实就是一个运算符,主要用来计算所占空间字节的大小。
指针字节:
指针 16位 2个字节
指针 32位 4个字节
指针 64位 8个字节
32位系统:
char 1个字节
short 2个字节
int 2个字节
long 4个字节
char* 4个字节
int* 4个字节
int** 4个字节
64位系统:
char 1个字节
short 2个字节
int 4个字节(x 2)
long 8个字节(x 2)
char* 4个字节
int* 4个字节
int** 4个字节
- 字符串常量放在静态存储区,为只读,不能再通过指针修改,例如chr *p=“xiaolong”
- strlen遇到\0结束,长度不包括\0
- sizeof计算占用多少字节时,\0也包含在内
1. strlen()
int main () { char *str="xiaolong"; printf("%d\n",strlen(str)); return 0; } 输出:8
#include <stdio.h> #include <string.h> int main () { char str[]="xiaolong"; printf("%d\n",strlen(str)); return 0; } 输出:8
#include <string.h> int main () { char str[10]="xiaolong"; printf("%d\n",strlen(str)); return 0; } 虽然数组大小是10,但是编译器自动在xiaolong后面添加了\0 ,因此长度不是10而是8 输出:8
2. sizeof()
#include <stdio.h> #include <string.h> int main () { char str[10]="xiaolong"; printf("%d\n",sizeof(str)); return 0; } 指定大小为n的char数组无论如何都是占用n个字节,例如此处10字节 输出:10
#include <stdio.h> #include <string.h> int main () { char *str="xiaolong"; printf("%d\n",sizeof(str)); return 0; } 由于是指针,32位机器指针占4个字节 输出:4
#include <stdio.h> #include <string.h> int main () { char str[]="xiaolong"; printf("%d\n",sizeof(str)); return 0; } 结果不是8而是9,因为默认在后面添加了一个\0, \0也算一个字节 输出:9
1.size_t 的定义
size_t是一种机器相关的无符号类型,它被设计的足够大以便能表示内存中任意对象的大小。
在C语言中头文件为stddef.h,在C++语言中头文件为cstddef。
size_t 是sizeof的返回类型,在64位中是unsigned long int,在32位中是unsigned int。
2.使用
size_t类型通常用于循环、数组索引、大小的存储和地址运算。数组的下标通常定义为size_t类型。size_t可以跨平台,并且具有高代码的可移植性、有效性或者可读性。
参考资料:https://blog.csdn.net/shenlong1356/article/details/106321092/
加载全部内容