strlen函数与sizeof的区别,C语言strlen与sizeof的区别详解

2021年09月15日 阅读数:1
这篇文章主要向大家介绍strlen函数与sizeof的区别,C语言strlen与sizeof的区别详解,主要内容包括基础应用、实用技巧、原理机制等方面,希望对大家有所帮助。

strlen函数与sizeof的区别,C语言strlen与sizeof的区别详解

对于 strlen 和 sizeof,相信很多程序员会混淆其功能。虽然从表面上看它们均可以求字符串的长度,但两者却存在着许多不一样之处及本质区别。html

strlen

strlen 是一个函数,它用来计算指定字符串 str 的长度,但不包括结束字符(即 null 字符)。其原型以下面的代码所示:程序员

size_t strlen(char const* str);

也正由于 strlen 是一个函数,因此须要进行一次函数调用,调用示例以下面的代码所示:数组

char sArr[] = "ILOVEC";
/*用strlen()求长度*/
printf("sArr的长度=%d\n", strlen(sArr));

很显然,上面示例代码的运行结果为 6(由于不包括结束字符 null)。这里须要特别注意的是,函数 strlen 返回的是一个类型为 size_t 的值,从而有可能让程序致使意想不到的结果,以下面的示例代码所示:ide

/*判断一*/
if(strlen(x)>= strlen(y))
{
}
/*判断二*/
if(strlen(x)- strlen(y)>= 0)
{
}

从表面上看,上面的两个判断表达式彻底相等,但实际状况并不是如此。其中,判断表达式一没什么问题,程序也可以彻底按照预想的那样工做;但判断表达式二的结果就不同了,它将永远是真,这是为何呢?函数

缘由很简单,由于函数 strlen 的返回结果是 size_t 类型(即无符号整型),而 size_t 类型毫不多是负的。所以,语句“if(strlen(x)-strlen(y)>=0)”将永远为真。.net

一样,就算表达式中同时包含了有符号整数和无符号整数,仍是有可能产生意想不到的结果,以下面的代码所示:指针

/*判断一*/
if(strlen(x)>= 5)
{
}
/*判断二*/
if(strlen(x)- 5>=0)
{
}

很显然,判断表达式二的结果仍是永远是真,其缘由与上面相同。code

sizeof

关键字 sizeof 是一个单目运算符,而不是一个函数。与函数 strlen 不一样,它的参数能够是数组、指针、类型、对象、函数等,以下面的示例代码所示:htm

char sArr[] = "ILOVEC";
/*用sizeof求长度*/
printf("sArr的长度=%d\n", sizeof(sArr));

相对于函数 strlen,这里的示例代码运行结果为 7(由于它包括结束字符 null)。同时,对 sizeof 而言,由于缓冲区已经用已知字符串进行了初始化,其长度是固定的,因此 sizeof 在编译时计算缓冲区的长度。也正是因为在编译时计算,所以 sizeof 不能用来返回动态分配的内存空间的大小。对象

参考:C语言中文网 http://c.biancheng.net/view/342.html