如何进行sizeof和strlen解析

1.strlen函数.

strlen所作的仅仅是一个计数器的工作,它从内存的某个位置(可以是字符串开头,中间某个位置,甚至是某个不确定的内存区域)开始扫描,直到碰到第一个字符串结束符 '

strlen所作的仅仅是一个计数器的工作,它从内存的某个位置(可以是字符串开头,中间某个位置,甚至是某个不确定的内存区域)开始扫描,直到碰到第一个字符串结束符 '
\0'
为止,然后返回计数器值。

'
为止,然后返回计数器值。

2.sizeof操作符

如何正确解析sizeof和strlen掌握这两个函数的工作原理

sizeof()返回的是变量声明后所占的内存数,不是实际长度,此外sizeof不是函数,仅仅是一个操作符。

3.strlen和sizeof的区别

3.1 sizeof可以用类型做参数,strlen只能用char*做参数,且必须是以'
'
\0'
'
结尾的。

3.2 sizeof还可以用函数做参数,比如:short f();
printf("
%d\n"
, sizeof(f()));
输出的结果是sizeof(short),即2。

3.3 数组做sizeof的参数不退化,传递给strlen就退化为指针了。

3.4 大部分编译程序在编译的时候就把sizeof计算过了是类型或是变量的长度这就是sizeof(x)可以用来定义数组维数的原因。

3.5 strlen的结果要在运行的时候才能计算出来,是用来计算字符串的长度,不是类型占内存的大小。

3.6 sizeof后如果是类型必须加括弧,如果是变量名可以不加括弧。这是因为sizeof是个操作符不是个函数。

4.举例区别strlen和sizeof

1.char str[20]="
0123456789"
;

int a=strlen(str);
//a=10;
>
>
>
>
strlen 计算字符串的长度,以结束符 0x00 为字符串结束。   

int b=sizeof(str);
//而b=20;
>
>
>
>
sizeof 计算的则是分配的数组 str[20] 所占的内存空间的大小,不受里面存储的内容改变。

2.上面是对静态数组处理的结果,如果是对指针,结果就不一样了   

char* ss = "
0123456789"
;
  

sizeof(ss) 结果 4 ===》ss是指向字符串常量的字符指针,sizeof 获得的是一个指针的之所占的空间,应该是长整型的,所以是4

而sizeof(*ss) 结果 1 ===》*ss是第一个字符,其实就是获得了字符串的第一位'
0'
所占的内存空间,是char类型的,占了 1位

strlen(ss)= 10 >
>
>
>
如果要获得这个字符串的长度,则一定要使用 strlen。sizeof函数返回其参数在内存中所占用的字节数,而strlen函数返回参数所指向的字符串中字符的个数。

3.在使用sizeof时,有一个很特别的情况,就是数组名到指针蜕变,

char Array[3] = {'
0'
};
  

sizeof(Array) == 3;
  

char *p = Array;
  

strlen(p) == 1;
//sizeof(p)结果为4   

在传递一个数组名到一个函数中时,它会完全退化为一个指针

4. 内存补齐

class X

{

  int i;

  int j;

  char k;

};

X x;

cout<
<
sizeof(X)<
<
endl;
结果 12 ===》内存补齐

cout<
<
sizeof(x)<
<
endl;
结果 12 同上。

内存补齐是一个在笔试面试中比较容易考的知识点



在程序编写中,我们时常使用sizeof与strlen两个函数。sizeof用于获取类型或变量所占内存大小,而strlen用于获取字符串的长度。但是在实际使用时,对这两个函数的理解与掌握却是很多初学者遇到的难题。那么本篇文章就为大家详细解析sizeof与strlen的工作原理,让大家在编写代码时得心应手。
一、sizeof函数及其工作原理
在程序设计中,sizeof函数可以返回变量的数据类型所占用的字节数。语法上类似于函数,但是它不是一个函数,而是一个运算符。
sizeof的工作原理是:在编译的时候,编译器会根据类型或者变量的定义计算出需要分配的内存空间大小。因此sizeof可以直接返回数据类型所占用字节数。
二、strlen函数及其工作原理
字符串是由多个字符组成的字符数组,并以'\\0'结尾。在C语言中,一个字符串的长度就是该字符串中字符的个数,不包括结尾的'\\0'。而strlen函数就是用于计算字符串长度的函数。
strlen的工作原理是:当遇到第一个'\\0'时,程序停止,并返回遇到'\\0'之前的字符个数,作为字符串的长度。
三、如何避免sizeof和strlen的问题
在程序编写的过程中,sizeof和strlen的使用需要特别注意以下问题:
1. 数组与指针的关系
sizeof在遇到数组时,会自动计算数组类型占用的空间大小,但是在遇到指针的情况下,sizeof只会返回指针占用空间的大小,而不是指针所指向的空间大小。
strlen在遇到指针时,可能会导致访问越界,因为strlen只会在遇到'\\0'之前停止计算,在没有'\\0'的情况下,程序将无法停止。
2. 字符串常量和字符数组的区别
在使用strlen时,需要注意字符串常量在内存中分配的位置不同于字符数组,在字符数组中,'\\0'是在程序中动态赋值的;而在字符串常量中,'\\0'是在字符串编译时以'\\0'字符串结尾的字符的形式存在的。因此可以使用sizeof来获取字符串类型的大小。
4. 使用数据类型代替变量名称
在使用sizeof时,可以使用数据类型代替变量名称,这将会使代码更加具有兼容性和可读性。在遇到指针时,使用数据类型代替变量名称将可以避免类型匹配问题。
总之,sizeof和strlen在程序中的使用需要我们深入认识它们的工作原理,正确使用这两个函数。当然在实际编写中,也需要避免以上的问题,从而避免程序的错误出现。