C语言中sizeof与strlen区别

C语言中sizeof 与strlen 区别
一.本质区别
 
sizeof 和strlen 有真相上之别。sizeof 是C
语言的同等栽单目运算符,如++、–等,并无是函数,sizeof 的先行级为2
级,比/、% 等3 级运算符优先级赛,sizeof
坐字节的花样给来操作数的囤空间的高低。而 strlen 是一个函数,是由 C
语言
的标准库提供的。strlen 计算的  是字符串的长短。
 
二.采取分别
 
1.sizeof
 
sizeof 的操作数可以是数据类型、函数、变量,表达式使用方法呢:
 
(1)数据类型
 
sizeof  (type )
 
如我们设算一个int 型数据的存储空间可以为此: sizeof
(int)。需要专注的是
sizeof
的操作数是数据类型时假如加括号。其数值大小为该数据类型所占用的囤空
其中的字节数。
 
(2)变量
 
sizeof(变量名)
 
设定义 int a  ,可以动用 sizeof  (a )计算a
变量占据的蕴藏空间。具体大小
同a 的色有关。
 
小心:由于sizeof 是操作符sizeof a或sizeof  (a
)都可。(可以免动括号),
只要操作数是几度组名则于起数组所占内存的字节数。如果反复组名做函数的参数
传递时落后为指针。
 
(3)表达式
 
sizeof  (表达式)
 
sizeof
可以针对一个表达式求值,编译器根据表达式的尾声结出类型来规定大小,
貌似不会见针对表达式进行计算。例如:sizeof(1+1.5)
 
(4)函数调用
                  
 
sizeof(函数名())
 
sizeof
也可以针对一个函数调用求值,其结果是函数返回路的深浅,函数并无会见
为调用,举例来说定义如下函数:
 
int myprint ()
{
    printf(“hello\n” );
    return 0;
}
 
int main()
{
  printf(“%d”,sizeof(mypaint()));
  return 0;
}
结果只打印函数返回路的sizeof
值,并无打印hello说明函数myprint并无
调用。
 
C99
标准规定,函数、不能够确定项目的表达式以及位域(bit-field)成员不可知被
计算sizeof 值,即下面这些写法都是一无是处的:
若果:sizeof(myprint)(注意 sizeof(myprint()是可以的))
要么sizeof 一个void 返回路的函数如:
void foo () { }
sizeof( foo () );
       以及位域:
struct S
{
unsigned int f1 : 1;
unsigned int f2 : 5;
unsigned int f3 : 12;
};
sizeof( S.f1 );
 
2.strlen
 
strlen 的利用则不像 sizeof 那么大,strlen 的参数必须是char *
的指针,如果用
strlen 计算数据类型 strlen(int)这种用法是谬误的。strlen
的计算必须依靠字符
列中之’\0’ 字符,strlen  就是经判断是否碰到’\0’
来判断字符序列是否终止
的。
她的计原理类似于下的少数条语句
while(*p!=’\0’)
      length++
 
strlen 的用法:分为以下几栽参数
 
(1)char *  指针
        
strlen(指针名)
 
设参数是指针则计算该指针指于字符序列的长短。(以’\0’
作为判断标志)例如:
 
定义char *p=“hello world”;strlen(p)=11,而 sizeof  (p)=4。可以看
strlen
算算的是指针指向的字符串的尺寸要sizeof 计算的是指针本身所占有的内存空
里面的大小。
 
(2)数组
 
strlen(数组名)
 
倘若参数是累组的口舌,实际传递的凡一个指针,strlen
会按照地方处理指针的模子
庆典处理该数组。
 
咱得以看下面的例子:
          
char a[]=”hh”;
            strlen(a);
 
不行醒目strlen 的结果是2。但是倘若数组是如此赋值的吧?
          
char a[]={‘h’,’h’};
            strlen(a);
 
这就是说现在strlen(a )的结果又是聊为?这个累就无肯定了,原因是 strlen
会去
计算a 地址开始之字符串的长,由于前一样栽赋值方式会将hh以字  符串的款型
赋值给数组会将字符串结束符’\0’ 一同赋值,这时strlen
就见面检查至了符停止
计,而第二种植复值方式是盖单个字符的样式赋值没有收  符’\0’,
这时我们之所以
sizeof 得到的结果是常规的,而之所以 strlen
由于找不至了符,会继续的乘除直到
找到了符为止。所以是累是不确定.


One example

 

#define PATH_TMP             “12345”

static void test_sizeof_strlen() {

    char *msg = “12345”;
    printf(“sizeof(msg)—%d\n” , sizeof(msg));
    printf(“strlen(msg)—%d\n” , strlen(msg));

    char array[] = “12345”;
    printf(“sizeof(array)—%d\n” , sizeof(array));
    printf(“strlen(array)—%d\n” , strlen(array));

    printf(“sizeof(PATH_TMP)—%d\n” , sizeof(PATH_TMP));
    printf(“strlen(PATH_TMP)—%d\n” , strlen(PATH_TMP));

}

The output result:

sizeof(msg)—4
strlen(msg)—5
sizeof(array)—6
strlen(array)—5
sizeof(PATH_TMP)—6
strlen(PATH_TMP)—5

 

 ————————————————————————————————————————

一、sizeof的概念
  sizeof是C语言的一律栽单目操作符,如C语言的其他操作符++、–等。

她并无是函数。

sizeof操作符以字节形式被出了该操作数的仓储大小。

操作数可以是一个表达式或括在括号内之档次名。

操作数的储存大小由操作数的类别决定。 
第二、sizeof的利用办法
  1、用于数据类型 
  sizeof使用形式: sizeof(type)   数据类型必须用括号括住:
sizeof(int)
  2、用于变量 
  sizeof使用形式: sizeof(var_name) 或 sizeof var_name 
  变量叫好不用括号括住.如sizeof
(var_name),sizeof var_name等还是不易形式

带括号的用法更宽泛,大多数程序员采用这种样式。 
  注意:sizeof操作符不能够用于函数类型,不了类型或者个字段。

勿完全类型因具有未知存储大小的数据类型,

万一雾里看花存储大小的数组类型、未知内容的结构还是同型、void类型等。 
  例如: sizeof(max) –若此时变量max定义为int max();

sizeof(char_v) 
–若此时char_v定义为char char_v[MAX]且MAX未知,

sizeof(void)

以上还是未得法形式。 
其三、sizeof的结果(以下结果尚且是以Linux v2.6 gcc v4抱)
  sizeof操作符的结果类型是size_t

她于峰文件被定义为: typedef unsigned int size_t;

拖欠型保证能包容实现所建立之顶深目标的字节大小.
  1、ANSI C正式确定字符类型为1字节。 
sizeof(char) = 1;

sizeof(unsigned char) = 1;

sizeof(signed char) = 1;   
  2、其他品种在ANSI C中并未具体规定,大小依赖让贯彻。

 
sizeof(int) = 4;

sizeof(unsigned int) = 4;

sizeof(short int) = 2;

sizeof(unsigned short) = 2;

sizeof(long int) = 4;

sizeof(unsigned long) = 4;

sizeof(float) = 4;

sizeof(double) = 8;

sizeof(long double) = 12;

  3、当操作数是指针时,sizeof依赖让编译器。

 

Microsoft C/C++7.0着,near类指针字节数为2,far、huge类指针字节数为4。

相似Unix/Linux的指针字节数为4。 

例如: char *p; //Linux中

sizeof(p) = 4;
  4、当操作数具有数组类型时,其结果是反复组的总字节数。

 

例如: char a[5];

int b[5];

sizeof(a) = 5;

sizeof(b) = 20;

 

5、当操作数是实际的字符串或者数值时,会冲现实的种进行对应转化。

 

如: sizeof(8) = 4; //自动转化为int类型

sizeof(8.8) = 8; //自动转化为double类型,注意,不是float类型

sizeof(“ab”) = 3 //自动转化为数组类型,

//长度是4,不是3,因为增长了最后的’\n’符

//有材料说,会自动转发为指针类型(Linux为4)

//可能跟操作系统和编译器有关系

  6、当操作数是齐项目时,sizeof是该最为老字节成员的字节数。

当操作数是构造类型时,sizeof是其成员类型的总字节数,包括上字节在内。 

 

要么受咱以例子来提:

union u{ //对union来说

char c;

double d;

}u;

sizeof(u) = max(sizeof(c),sizeof(d)) = sizeof(1,8) = 8;

  struct
a{ //对struct来说

char b; 

double x;

}a;   在Linux上: sizeof(a) = 12;

要貌似sizeof(char) + sizeof(double) = 9;
  这是盖编译器在设想对联合问题时常,在组织中插空位以决定各成员对象的地方指向同。

但是如若都针对同步的言辞,sizeof(a) = 16,
这是为b被坐偏移量为0的地址,占1只字节;

每当存放x时,double类型长度也8,需要安放能吃8整理除的偏移量上,这时候要补7只空字节,

高达8独,这时候偏移量为8,放上x后长也16。

于此例中,所有的组织成员还设放在给4规整除之地点(Linux的存放方式),这里补3只字节,所以也12。
  7、当操作数是函数中之数组形参或函数类型的形参:

 

sizeof给出那指针的轻重缓急,Linux中值为4。
季、sizeof与另操作符的涉嫌
  sizeof的预先级为2级,比/、%等3级运算符优先级赛。

它们可以跟其余操作符一起构成表达式:

例如: int i = 10;

i * sizeof(int);

五、sizeof的主要用途
  1、主要用途是跟储存分配与I/O系统那样的例程进行通信。

 

例如: void *malloc(size_t size);    size_t fread(void *ptr,
size_t size, size_t nmemb, FILE * stream); 
  2、另一个的主要用途是计量数组中元素的个数。

 

例如: void *memset(void *s, int c, sizeof(s)); 

 


sizeof和strlen的区别

例1:char ss[100]=”0123456789”;

             Sizeof(ss)结果也100,ss表示在内存中预分配的大小,100*1;

           
 Strlent(ss)结果也10,它的其中贯彻是因此一个循环计算字符串的长,直到”\0”为止。

例2:int ss[100]=”0123456789”;

             Sizeof(ss)结果也400,ss表示于内存中的高低,100*4;

           
 Strlen(ss)错误,strlen的参数只能是char*,且要是因”\0”结尾的。

总结sizeof和strlen的区别

⒈sizeof操作符的结果类型是size_t,它以峰文件中之typedef为unsigned int
类型。该档保证能包容实现所立之太特别目标C语言的字节大小。

⒉sizeof是运算符,strlen是函数。

⒊sizeof可以用型做参数,strlen只能用char*开参数,且务必是以”\0”结尾的。sizeof还可据此函数做参数,比如:           
short f();          

printf(“%d\n”,sizeof(f()));

出口的结果是sizeof(short),即2。

⒋数组开sizeof的参数不落伍,传递给strlen就落伍为指针。

⒌大部分编译程序在编译的下就拿sizeof计算了了,是路或者变量的长度。这就是是sizeof(x)可以据此来定义数组位数的原因。

                                                                       
char str[20]=”0123456789”;

                                                                       
int a=strlen(satr);            //a=10;

                                                                       
int b=sizeof(str);            //b=20;

⒍strlen的结果使在运行的时光才会计算出来,用来算字符串的尺寸,而无是路占内存的大大小小。

⒎sizeof后使是种必须加括号,如果是变量叫作好免加括号。这是以sizeof是单操作符而未是函数。

⒏当使用一个结构类型或者变量时,sizeof返回实际的尺寸。当以一静态的长空数组时,sizeof返回全部屡屡组的尺寸。Sizeof操作符不可知回去给动态分配的数组或外部的数组的尺寸。

⒐数组作为参数传为函数时传得是指针而非是屡组,传递的是累组的首地址。在C++里传递数组永远都是传递对数组首元素的指针,编译器不知晓数组的轻重缓急,如果想在函数内明数组的大大小小要在函数里面所以memcpy将数组复制出来,长度由其余一个示参传禁区。

⒑计算结构变量的高低就亟须讨论数量对那问题。

⒒sizeof操作符不能够用来函数类型,不完全类型或者个字段。不全类型因具备未知存储大小数据的数据类型,如雾里看花存储大小的数组类型,未知内容的结构要并型,void类型等。

 

Sizeof的利用场所

先是要分明sizeof不是函数,也非是平处女运算符,它是独八九不离十宏定义的独特重点字,sizeof()。括号内的内容在编译过程被凡是免叫编译的,而是让代类型,如int
a=8; 
sizeof(a)。在编译过程遭到,不管a的价值是什么,知识让替换成类型sizeof(int),结果为4。如果sizeof(a=6)呢?也是一律地换成a的项目,但是只要专注,因为a=6是不叫编译的,所以实行sizeof(a=6)后,a的价值还是8,是无变换的。

①    
sizeof操作符的一个主要用途是和仓储分配和I/O系统那样的例程进行通信。例如:

void *malloc(sizex_t size),

size_t fread(void * ptr, size_t size, size_t nmemb, FILE * stream)

②     用她好望某种类型的靶子在内存中所占的单元。例如:

void * memset(void * s, int c, sizeof(s))

③于动态分配一对象时,可以于系统掌握要分配多少内存。

④纵让部分项目的壮大。在Windows中有诸多构造类型就发一个特别的字段用来存放在该型的字节大小。

⑤由操作数的字节数在落实时可能出现转移,建议在论及操作数字节大小时用sizeof代替常量计算。

⑥比方操作数是函数中的数组形参或函数类型的形参,sizeof给有该指针的高低。

 

结论:

①    
unsigned影响的文化最高位bit的含义(正/负),数据长度是未见面被改的,所以:

sizeof(unsigned int) == sizeof(int);

②     自定义类型的sizeof取值等同于它们的档次原形。如:

typedef short WORD;

sizeof(short) == sizeof(WORD);

③     对函数使用sizeof,在编译阶段会给函数返回值的类型取代。如:

int f1() {return 0;}

cout<<sizeof(f1())<<endl;    
//f1()返回值为int,因此会面为当是int。

④     只要是指针,大小就是4。如:

cout<<sizeof(string*)<<endl; //4

⑤屡组的轻重缓急是各维数的乘积×数组元素的大大小小。