sizeof和strlen小结

sizeof和strlen小结

写在前面

之所以要总结一下sizeof和strlen的用法和区别,是因为这些知识可以帮助我们更加深入的理解各种数据结构在内存中的占用情况,也许表面上看好像没有多大用处,但有了这种理解,或许会对以后的编码有帮助。

sizeof

sizeof是一种操作符,它的作用是返回一个对象或类型名的长度,返回值的类型为size_t,长度的单位是字节。sizeof表达式的结果是编译时常量。具体有以下三种用法:
sizeof(类型名)
sizeof(表达式)
sizeof 表达式
使用sizeof操作符时,其结果部分地依赖所涉及的类型:
1、对char类型或值为char类型的表达式做sizeof操作保证得1;
2、对引用类型做sizeof操作将返回存放此引用类型对象所需的内存空间大小;
3、对指针做sizeof操作将返回存放指针所需的内存大小
4、对数组做sizeof操作等效于将其元素做sizeof操作的结果乘上数组元素的个数。
需要注意的是,sizeof不是一个函数,字节数的计算在程序编译时进行,而不是在程序执行的过程中才计算出来! 其返回值类型为size_t,在头文件stddef.h中定义。
sizeof的计算发生在编译时刻,所以它可以被当作常量表达式使用,如:

char ary[sizeof(int)*10];//ok

sizeof()函数返回的是变量声明后所占的内存数,不是实际长度。
测试代码如下:

    char *str = "I'm ok";
    char dst[] = "I'm ok";
    
    cout<<"sizeof *str = "<<sizeof(*str)<<endl;
    cout<<"sizeof str = "<<sizeof(str)<<endl;
    cout<<"sizeof dst = "<<sizeof(dst)<<endl;

程序运行结果如图:
enter description here
结果分析:
sizeof(*str):*str实际上就是'I',求sizeof(*str) = sizeof(char) = 1;
sizeof(str): str是一个指向字符串的指针,指针在内存中占4字节,因此sizeof(str) = 4;
sizeof(dst) : dst是一个数组,对数组做sizeof返回的是数组中元素的个数与单个元素sizeof的乘积,
但是需要注意的是,字符串数组默认以''结尾,因此dst数组中实际上有7个char元素,sizeof(dst) = 7

strlen

strlen()是C中的一个函数,包含在头文件#include<string.h>中,函数原型如下:
extern unsigned int strlen(char s)
用法:strlen (字符数组名)
功能:计算给定字符串的(unsigned int型)长度,不包括''在内
说明:返回s的长度,不包括结束符NULL。
其结果在
运行时才能计算。参数必须是字符型指针(char)。当数组名作为参数传入时,实际上数组就退化成指针了

测试代码及分析:

char *str = "I'm ok";
    cout<<strlen(str)<<endl;//结果为6

    char dst[] = "I'm ok";
    cout<<strlen(dst)<<endl;//结果为6

    char ch1[10];
    cout<<strlen(ch1)<<endl; //结果是不定的

    char ch2[10]={''}; 
    cout<<strlen(ch2)<<endl; //结果为0

    char ch3[10]="jun"; 
    cout<<strlen(ch3)<<endl; //结果为3,但不一定正确,
    //如果编译器将其他的非零字符串放在ch3[10]的内存地址后,strlen结果还是不定的

    //char ch4[5] = "hello";//编译错误,因为数组实际大小为6,声明的大小为5,报“数组界限溢出”错误

两者区别

(以下参考自百度百科)
1.sizeof操作符的结果类型是size_t,它在头文件中typedef为unsigned int类型。该类型保证能容纳实现所建立的最大对象的字节大小。
2.sizeof是算符,strlen是函数。
3.sizeof可以用类型做参数,strlen只能用char*做参数,且必须是以''''结尾的。
4.数组做sizeof的参数不退化,传递给strlen就退化为指针了。
5.大部分编译程序在编译的时候就把sizeof计算过了是类型或是变量的长度这就是sizeof(x)可以用来定义数组维数的原因
6.strlen的结果要在运行的时候才能计算出来,是用来计算字符串的长度,不是类型占内存的大小。
7.sizeof后如果是类型必须加括弧,如果是变量名可以不加括弧。这是因为sizeof是个操作符不是个函数。
8.当适用于一个结构类型时或变量, sizeof 返回实际的大小,当适用于静态的空间数组, sizeof 归还全部数组的尺寸。
sizeof 操作符不能返回被动态分派的数组或外部数组的尺寸
9.数组作为参数传给函数时传的是指针而不是数组,传递的是数组的首地址

原文地址:https://www.cnblogs.com/scut-linmaojiang/p/5284340.html