【问题标题】:A weird difference between strlen() and sizeof()strlen() 和 sizeof() 之间的奇怪区别
【发布时间】:2014-10-01 22:19:34
【问题描述】:

我试图测试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。有人可以帮我吗?

【问题讨论】:

    标签: c++ sizeof strlen


    【解决方案1】:

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

    【讨论】:

      【解决方案2】:

      strlen 需要一个以 null 结尾的字符串。 b 不是以空值结尾的。未定义的行为结果。

      【讨论】:

        【解决方案3】:

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

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

        【讨论】:

          【解决方案4】:

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

          您的问题的标题也颇具误导性。 “strlen() 和 sizeof() 之间的奇怪区别”? strlensizeof 是该语言的两个完全不相关的特性,几乎没有任何共同之处。他们自然是不同的。这就是为什么将它们之间的任何观察到的差异称为“奇怪”是……嗯,很奇怪。

          【讨论】:

            【解决方案5】:

            这不太准确,可能会导致误解,特别是因为 sizeof(A) 不会给你 13。

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

            strlen() 是一个函数,它接受一个指向字符的指针,并从这个字符开始遍历内存,寻找一个 NUL 字符。它在找到 NUL 字符之前计算字符数。换句话说,它为您提供了 C 风格的 NUL 终止字符串的长度。

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

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 1970-01-01
              • 2011-12-26
              • 1970-01-01
              • 2019-03-19
              • 1970-01-01
              • 2011-10-27
              • 1970-01-01
              相关资源
              最近更新 更多