strlen()和sizeof()之间有一个奇怪的区别

A weird difference between strlen() and sizeof()

本文关键字:区别 之间 sizeof strlen 有一个      更新时间:2023-10-16

我试图测试sizeofstrlen的差异,但今天我发现了一些奇怪的东西。代码如下。

#include <iostream>
#include <string.h>
using namespace std;
int main()
{
        char a[]={"I am a boy"};
        char b[]={'I',' ','a','m',' ','a',' ','b','o','y'};
        cout << "sizeof(a) = " << sizeof(a) << endl << "sizeof(b) = " << sizeof(b) <<endl;
        cout << "strlen(a) = "<< strlen(a) << endl << "strlen(b) = " << strlen(b) << endl;
        return 0;
}

结果如下:

sizeof(a) = 11
sizeof(b) = 10
strlen(a) = 10
strlen(b) = 11

我知道结果的前三行,但我不明白为什么strlen(b)是11。有人能帮我吗?

这只是运气。strlen取一个指向char的指针,并假定它是以nul结尾的字符串的开头。它基本上是向前走,直到找到一个。恰好在数组b结束后不久的某个地方有一个,但实际上您正在调用未定义的行为

strlen需要一个以null结尾的字符串。b未以null终止。未定义的行为结果。

sizeof()告诉我们编译器对对象大小(不一定是其内容)的了解。

strlen()在运行时从我们给它的地址开始遍历内存,寻找零,并在找到零之前计算它经过了多少内存位置。

strlen的参数必须是C样式字符串。您的b不是C样式字符串。将非C样式字符串传递给strlen会触发未定义的行为。这就是你观察到的。无论你从strlen(b)得到什么结果(如果有的话)都是毫无意义的。

你的问题的题目也有误导性。"strlen()和sizeof()之间的奇怪区别"?CCD_ 17和CCD_。他们天生就不一样。这就是为什么将他们之间观察到的任何差异称为"怪异"是……嗯,怪异。

这并不准确,可能会导致误解,尤其是因为sizeof(a)不会给你13。

sizeof()是一个编译时表达式,用于提供类型或变量类型的大小。它不关心变量的值。

strlen()是一个函数,它获取一个指向字符的指针,并从此字符开始遍历内存,寻找NUL字符。它计算在找到NUL字符之前的字符数。换句话说,它给出了以NUL结尾的C样式字符串的长度。

两者的目的完全不同,几乎没有任何关系。在C++中,您不需要太多;strlen()用于C风格的字符串,应该用C++风格的std::string替换,而C中sizeof()的主要应用程序是作为malloc()、memcpy()或memset()等函数的参数,所有这些函数都不应该在C++中使用(使用new、std::copy()和std::fill()或构造函数)