sizeof和strlen的区别

一.一些废话

  关于sizeof和strlen这两者的区别之前自己也是模糊不清,分不清谁的计算结果包含,谁的计算结果不包含,因此写下自己的一些理解,有错误的地方希望大家指出。

二.一些理论

  首先,sizeof它是一个关键字而不是函数,sizeof(int)和sizeof int,这两个计算的结果在32位系统下面结果都是4,一个有(),一个没有(),而我们都知道,函数都是带()的,因此sizeof不是函数,而是关键字。相反strlen是函数。strlen()用于计算字符串中字符的数目(也就是字符长度,以字符为单位给出字符串长度,但是一个字符占用一个字节),当它遇到时候就会停止,因此它计算的结果中并不包括在内。而sizeof关键字计算得是在内存中占用的空间,在我们初始化字符数组时候编译器会在后面自己加上,因此sizeof在计算时候它的结果将包含在内。

  strlen既然是函数,就必然涉及到参数的问题,他的参数是指针,在VC++6.0中,原型为size_t strlen(const char *string);传递的值可以是个指针也可以是个数组名(其实数组名也是一个地址),以下是百度百科的解释:strlen所作的仅仅是一个计数器的工作,它从内存的某个位置(可以是字符串开头,中间某个位置,甚至是某个不确定的内存区域)开始扫描,直到碰到第一个字符串结束符''为止,然后返回计数器值(长度不包含'')。

三.代码说明

#include <stdio.h>
#include <string.h>

int main(int argc, char *argv[])
{
  char *str = "ABCDEFGH";
  char arr[] = "ABCDEFGH";
  int len = 0;
  int len_1 = 0;
  int len_2 = 0;
  int len_3 = 0;

  len = strlen(str);
  len_1 = sizeof(arr);
  len_2 = strlen(arr);
  len_3 = sizeof(str);
  printf("len = %d ", len);
  printf("len_1 = %d ", len_1);
  printf("len_2 = %d ", len_2);
  printf("len_3 = %d ", len_3);

  return 0;
}

输出结果:len = 8

                  len_1 = 9

                  len_2 = 8

     len_3 = 4

分析:首先定义了一个指向字符类型的指针,并初始化:char *str = "ABCDEFGH";这个时候编译器会在字符串后面自动加上。

      其次定义了一个字符数组,并初始化:char arr[] = "ABCDEFGH";注意此时我们并没有指定数组大小,但是我们聪明的编译器会根据字符数自主决定他的大小,并在后面加上。因此大家不要误以为数组的大小不确定。所以根据sizeof来计算,它们两者占用的内存空间都是9字节,strlen计算得到的字符数都是8个字符。然后sizeof(str),这是计算类型大小的经典应用,在32位系统下,指针都是占4个字节的空间。

四.拓展一下

如果将char *str = "ABCDEFGH";和char arr[] = "ABCDEFGH";改为下面的形式呢?

char str[8] = "ABCDEFGH";

char arr[8] = "ABCDEFGH";

计算的结果又是多少?

分析一下:strlen(str)等于多少?strlen(arr)等于多少?sizeof(str)和sizeof(arr)又等于多少?

Dev-C++5.2.0.3编译运行得到的结果为:len = 8, len_1 = 8,  len_2 = 16, len_3 = 8.

不同的编译器会有不同的处理方式,大家遇到类似问题时候还是要以的位置为准。

原文地址:https://www.cnblogs.com/timemachine213/p/8321164.html