zoukankan      html  css  js  c++  java
  • 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.

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

  • 相关阅读:
    bzoj3262 陌上花开
    bzoj2738 矩阵乘法
    bzoj3110 [Zjoi2013]K大数查询
    bzoj2527 [Poi2011]Meteors
    bzoj1758 [Wc2010]重建计划
    启动应用程序的Activty多种方式
    隐藏应用图标的多种方式
    Loading Large Bitmaps Efficiently
    java中的匿名内部类总结
    android listview addHeaderView和addFooterView的注意事项
  • 原文地址:https://www.cnblogs.com/timemachine213/p/8321164.html
Copyright © 2011-2022 走看看