【问题标题】:What's the difference among '0', '\0' and 0 with sizeof() and strlen()?'0'、'\0' 和 0 与 sizeof() 和 strlen() 有什么区别?
【发布时间】:2013-09-14 02:59:05
【问题描述】:
#include <iostream>

int main(int argc, char* argv[])
{
    int pt[4] = {'0','\0',0};
    std::cout<<"size of pt: "<<sizeof(pt)<<std::endl;
    std::cout<<"strlen of pt: "<<strlen((char*)pt)<<std::endl;
}

结果是:

size of pt: 16
strlen of pt: 1

当我将int pt[4] = {'0','\0',0}; 更改为int pt[4] = {'\0','0',0};

结果是

size of pt: 16
strlen of pt: 0

为什么?

【问题讨论】:

  • 字符串以 '\0' (null) 字符结尾。所以第一个确实有一个值,然后字符串结束,而第二个没有值。不过,这只是一个假设。

标签: c++ sizeof strlen


【解决方案1】:
  • '0' 是“ASCII 字符 0”,其值为 0x30
  • '\0' 是代表值0 的字符,其值为0
  • 0 就是 0 的值。
  • pt 是一个由4 整数组成的数组,所以它的大小是我们机器上整数大小的4 倍(显然是4),所以你得到16
  • 由于pt 是一个整数数组,其第一个值为0,即0x30,因此该整数值为0x00000030。当您键入 cast pt 到一个字符指针时,它看起来就像一个指向前 3 个值为零的字符串的指针。所以strlen0(编辑:因为你的特定架构的endianness)。

【讨论】:

  • 以及为什么在第一个例子中pt的strlen:1
  • @denzel_wu 如果你的架构是小端的,那么pt[0] 的最低有效字节(0x30)存储在数组pt 的第一个字节中。因此,strlen(pt) == 1.
【解决方案2】:

'0'是一个值为48的字符,代表可打印可显示的数字。

'\0'0 都是值 0,第一个是字符类型,第二个是整数字面量。

sizeof 给出对象或数组中的字节数。 strlen 计算从 char 数组的开头到值为 0 的第一个字节的字节数,不包括终止 0。在您的示例中,您有一个 4 个整数的数组,每个 int 占用 4 个字节; 4*4=16。

【讨论】:

    猜你喜欢
    • 2016-03-23
    • 2021-06-16
    • 2012-09-23
    • 2021-02-13
    • 2012-08-02
    • 1970-01-01
    • 2016-02-19
    • 2012-03-24
    相关资源
    最近更新 更多