C语言中sizeof()与strlen()函数的使用入门及对比

sizeof()函数
1,是什么?
    sizeof其实就是一个运算符,和那些+,-一样的东西,在程序编译的时候进行解析转换。虽然我们经常见到sizeof后面跟着个小括号,长得和函数差不多,但它和函数完全是两码事。
2,有什么用?
    sizeof其实就是用于告诉我们编译器在为某一特定数据或者某种数据类型的数据在存储空间中开辟空间时,开辟的空间大小,以字节为单位。
3,怎么用?
    sizeof(类型),或者sizeof(变量)都可以,得到的就是类型或者变量的存储空间。当对变量用的时候,也可以没有括号,直接 sizeof 变量,但一般不用(我一般都是只记一种通用的用法……)。
4,用的时候要注意什么?
(1)sizeof返回的占用空间大小是为这个变量开辟的大小,而不只是它用到的空间。和现今住房的建筑面积和实用面积的概念差不多。所以对结构体用的时候,大多情况下就得考虑字节对齐的问题了。
(2)对位域成员等连编译器都无法确定存储空间的东西不能用。这个应该比较好理解,因为sizeof返回的都是以字节为单位的数据,你让它去求那些以位为单位的大小,这不是存心难为编译器嘛。所以编译器采用的方案是统一不受理,即使你说你刚好是8位,占一个字节,编译器也不理你。
(3)sizeof返回的数据类型是unsigned int。因为C中不同类型数据混合运算时的自动转换,有时候不注意的话可能会出问题,具体可以参照下面的程序例子。
(4)要注意数组名和指针变量的区别。通常情况下,我们总觉得数组名和指针变量差不多,但是在用sizeof的时候差别很大,对数组名用sizeof返回的是整个数组的大小,而对指针变量进行操作的时候返回的则是指针变量本身所占得空间,在32位机的条件下一般都是4。而且当数组名作为函数参数时,在函数内部,形参也就是个指针,所以不再返回数组的大小。
5,实例分析
源码:

#include<stdio.h>

int main()
{
    int iVal = 3;
    printf("The size of type int is %d \n", sizeof(int));
    printf("The size of iVal is %d\n", sizeof(iVal));
    printf("The size of iVal is %d\n", sizeof iVal);

    if((iVal - sizeof(int)) < 0)
    {
        printf("The return type is int\n");
    }
    else
    {
        printf("The return type is unsigned int\n");
    }

    char chArrayCon[7];
    char *chp;
    chp = chArrayCon;
    printf("The size of chArrayCon is %d, The size of chp is %d\n", sizeof(chArrayCon), sizeof(chp));

    int iArraySize = 3;
    char chArrayVar[iArraySize];
    printf("The size of chArrayVar is %d\n", sizeof(chArrayVar));
    return 0;
}

运行结果:

The size of type int is 4
The size of iVal is 4
The size of iVal is 4
The return type is unsigned int
The size of chArrayCon is 7, The size of chp is 4
The size of chArrayVar is 3

结果分析:
    代码第一部分主要就是简单的表示了一下用法。
    第二部分说明了注意事项的第三项。按说,iVal的值是3,减4的话应该是-1,小于0,输出的应该是"he return type is int"。但是由于当int和unsigned int一起运算时,会默认变成unsigned int,所以结果会是一个很大的unsigned int类型的数,是大于0的。
    代码第三部分就简单说明了数组名和指针变量的区别,即使你把指针变量指向数组名,编译器依然能够分辨出区别。

以上讲述的都没有考虑在C99标准下的情况。因为在C99标准下有种特殊情况,那就是不定长数组的使用。当对不定长数组名使用sizeof的话,返回的也是整个数组的大小,就像实例中第四块代码一样。但是这并不是在编译阶段执行的,而是在程序运行阶段执行的。因为在编译的时候,编译器一般不知道变量的值是多少。(当然例子中我直接赋值3,可能不方便理解,可以假想iArraySize是通过scanf来获得实际数值的,然后再声明数组的)。对于这种情况,实际中应用的并不多,大家可以当做特殊情况对待即可,或者直接忽略掉也行……
6总结
    其实sizeof的作用就是告诉我们分配给变量的“建筑面积”的大小,只要记得这一点应该就够了,不管这个变量类型是普通的整型数据,还是结构体,共用体,枚举……记住这一点后,当我们再去想知道sizeof对不同数据类型操作返回的值到底是什么的时候,只需搞明白那些数据类型到底要消耗多少“建筑面积”就可以啦!

strlen()函数
C库函数 size_t strlen(const char *str) 计算字符串str的长度,但不包括终止空字符。

声明
以下是声明的strlen() 函数。

size_t strlen(const char *str)

参数
str -- 这是字符串的长度要计算的。

返回值
这个函数返回字符串的长度。

例子
下面的例子显示使用strlen() 函数。

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

int main ()
{
  char str[50];
  int len;

  strcpy(str, "This is yiibai.com");

  len = strlen(str);
  printf("Length of |%s| is |%d|
", str, len);

  return(0);
}

让我们编译和运行上面的程序,这将产生以下结果:

Length of |This is yiibai.com| is |26|

sizeof与strlen的用法区别
1. sizeof操作符的结果类型是size_t,它在头文件中typedef为unsigned int类型。该类型保证能容纳实现所建立的最大对象的字节大小。

2. sizeof是运算符(C++ 关键字),strlen是函数。

3. sizeof可以用类型做参数,strlen只能用char*做参数,且必须是以”\0”结尾的。sizeof还可以用函数做参数,比如:

short f();
printf("%d\n", sizeof(f()));

输出的结果是返回值的类型的大小, 即sizeof(short)=2。

4. 数组做sizeof的参数不退化,传递给strlen就退化为指针了。大部分编译程序在编译的时候就把sizeof计算过了,是类型或是变量的长度,这就是sizeof(x)可以用来定义数组维数的原因。

char str[20]="0123456789";
int a=strlen(str); //a=10;
int b=sizeof(str); //b=20;

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

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

6. 当适用了于一个结构类型时或变量, sizeof 返回实际的大小,当适用一静态地空间数组, sizeof 得到全部数组的尺寸。sizeof 操作符不能返回动态地被分派了的数组或外部的数组的尺寸。

7. 数组作为参数传给函数时传的是指针而不是数组,传递的是数组的首地址,如:

fun(char [8])
fun(char [])

都等价于 fun(char *)。

在C++里参数传递数组永远都是传递指向数组首元素的指针,编译器不知道数组的大小。如果想在函数内知道数组的大小, 需要这样做:

进入函数后用memcpy拷贝出来,长度由另一个形参传进去

fun(unsiged char *p1, int len)
{
 unsigned char* buf = new unsigned char[len+1]
  memcpy(buf, p1, len);
}

sizeof对指针的话,结果是相应的类型:

char* ss = "0123456789";
sizeof(ss)

结果是4 => ss是指向字符串常量的字符指针,sizeof 获得的是一个指针的之所占的空间,应该是长整型的,所以是4. sizeof(*ss) 结果 1, => *ss是第一个字符,其实就是获得了字符串的第一位“0” 所占的内存空间,是char类型的,占了1个字节,strlen(ss)= 10 >>>> 如果要获得这个字符串的长度,则一定要使用 strlen.

(0)

相关推荐

  • C语言位运算和sizeof运算符详解

    位运算和sizeof运算符 C语言中提供了一些运算符可以直接操作整数的位,称为位运算,因此位运算中的操作数都必须是整型的.位运算的效率是比较高的,而且位运算运用好的话会达到意想不到的效果.位运算主要有6种:与(&),或(|),取反(~),异或(^),左移(<<),右移(>>). 1.位运算中的类型转换 位运算都必须进行Integer Promotion.在进行运算之前,都必须将char型.short型的数据转换为int或者unsigned int型再参与运算. 如下面这段程

  • 浅析C语言中的sizeof

    这是一个依赖于编译系统的值,一般定义为typedef unsigned int size_t;编译器林林总总,但作为一个规范,都会保证char.signedchar和unsigned char的sizeof值为1,毕竟char是编程能用的最小数据类型.MSDN上的解释为:The sizeof keyword gives the amount of storage, in bytes, associated with avariable or atype (including aggregate

  • 深入sizeof的使用详解

    经常在C下编程,不了解精通sizeof就有点说不过去了,本文可没有sizeof与strlen的区别哦,尽管这个对比很经典,不过,将就点吧. 一.sizeof的概念 sizeof是C语言的一种单目操作符,如C语言的其他操作符++.--等.它并不是函数.sizeof操作符以字节形式给出了其操作数的存储大小.    操作数可以是一个表达式或括在括号内的类型名.操作数的存储大小由操作数的类型决定. 二.sizeof的使用方法1.用于数据类型 sizeof使用形式:sizeof(type) 数据类型必须用

  • 解析一个有关sizeof用法的题目--sizeof(i++)

    复制代码 代码如下: #include <stdio.h>  int main()  {  int i;  i = 10;  printf("%d\n", i);  printf("%d\n", sizeof(i++));  printf("%d\n", i);  return 0;  } 这三行输出应该是什么?答案是:10410第三个为什么不是11? i为什么没有自增?请看C++标准;5.3.3 sizeofThe sizeof o

  • C++无法重载点符号、::、sizeof等的原因

    大多数的运算符能够被程序员重载.例外的是:     . (点符号) :: ?: sizeof 并没有什么根本的原因要禁止重载?:.仅仅是因为,我没有发现有哪种特殊的情况需要重载一个三元运算符.注意一个重载了 表达式1?表达式2:表达式3 的函数,不能够保证表达式2:表达式3 中只有一个会被执行. Sizeof 不能够被重载是因为内建的操作(built-in operations),诸如对一个指向数组的指针进行增量操作,必须依靠它.考虑一下: X a[10]; X* p = &a[3]; X* q

  • sizeof()的简单介绍

    (一)基本概念 sizeof操作符以字节形式给出了其操作数的存储大小.操作数可以是一个表达式或括在括号内的类型名.操作数的存储大小由操作数的类型决定. (二)使用方法 1.用于数据类型 sizeof使用形式:sizeof(type) ,如sizeof(int) 2.用于变量 sizeof使用形式:sizeof(var_name)或sizeof var_name 变量名可以不用括号括住.如sizeof (var_name),sizeof var_name等都是正确形式.带括号的用法更普遍,大多数程

  • C#中sizeof的用法实例分析

    sizeof是C#中非常重要的方法,本文就以实例形式分析C#中sizeof的用法.分享给大家供大家参考.具体分析如下: 在C#中,sizeof用来计算类型的大小,单位是字节.有这样的一个类: public class MyUglyClass { public char myChar1; public int myInt; public char myChar2; } 在客户端,试图使用sizeof计算该类型的大小. class Program { static void Main(string[

  • C语言中的sizeof操作符用法及和strlen的区别

    一. 定义: sizeof是C/C++中的一个操作符(operator),简单的说其作用就是返回一个对象或者类型所占的内存字节数.其返回值类型为size_t,在头文件stddef.h中定义.在32位系统中: char的sizeof值为1,char是我们编程能用的最小数据类型. short的sizeof值为2: int.float.long为4: double为8: 所有的指针的sizeof值都为4. 二.语法: sizeof有三种语法形式,如下: 1) sizeof( object ); //

  • php检测数组长度函数sizeof与count用法

    本文实例讲述了php检测数组长度函数sizeof与count用法.分享给大家供大家参考.具体如下: 在php检测数组长度的函数有sizeof count 下面看个简单实例: 复制代码 代码如下: $colorlist = array("apple"=>"red", "grass"=>"green","sky"=>"blue","night"=>

  • C语言中关于sizeof 和 strlen的区别分析

    1.编译时计算运算符sizeof,可用类型或变量做参数,计算占用内存的大小.sizeof后若是类型必须加括弧,若是变量名可不加括弧.sizeof(x)可用来定义数组维数如: 复制代码 代码如下: printf("%d\n", sizeof(short)); 输出的结果为短整型的长度2.用结构类型或变量做参数时,sizeof 返回实际的大小,当用于静态数组时,sizeof 返回全部数组的尺寸.sizeof 操作符不能返回动态地被分派了的数组或外部的数组的尺寸 2.运行时计算strlen,

随机推荐