C++中sizeof和strlen的区别

科技   2024-12-22 19:15   上海  

在C++编程中,sizeofstrlen是两个用于获取数据大小的函数,但它们的用途、工作原理和返回值类型都有显著的区别。了解这些区别对于正确编写和处理字符串及数组至关重要。

1. sizeof

  • 用途sizeof是一个编译时运算符,用于获取变量或数据类型所占用的内存大小(以字节为单位)。
  • 返回值类型sizeof的返回值类型是size_t,这是一个无符号整数类型,定义在头文件<stddef.h>中。
  • 工作原理sizeof在编译时计算其参数的大小,而不是在运行时。这意味着它不会实际访问内存中的数据。
  • 适用对象:可以用于任何数据类型(包括数组、结构体、类等),甚至是未定义的变量(例如,sizeof(int))。

2. strlen

  • 用途strlen是一个运行时函数,用于计算以空字符('\0')结尾的C风格字符串(字符数组)的长度(不包括结尾的空字符)。
  • 返回值类型strlen的返回值类型是size_t
  • 工作原理strlen在运行时计算字符串的长度,通过遍历字符串直到遇到空字符。
  • 适用对象:只能用于以空字符结尾的字符数组(C风格字符串)。

代码举例

下面是一个简单的C++代码示例,展示了sizeofstrlen的不同用法和结果:

#include <iostream>
#include <cstring>  // 包含strlen函数

int main() {
    // 定义一个C风格字符串
    char str[] = "Hello, World!";

    // 使用sizeof计算数组的大小(包括结尾的空字符)
    std::cout << "Size of array (in bytes): " << sizeof(str) << std::endl;

    // 使用strlen计算字符串的长度(不包括结尾的空字符)
    std::cout << "Length of string: " << strlen(str) << std::endl;

    // 定义一个指针指向字符串
    char *ptr = str;

    // 使用sizeof计算指针的大小(指针的大小是固定的,与指向的数据无关)
    std::cout << "Size of pointer (in bytes): " << sizeof(ptr) << std::endl;

    // 尝试使用strlen计算指针的大小(这是错误的,会导致未定义行为)
    // std::cout << "Length of pointer (WRONG): " << strlen(ptr) << std::endl; // 不要这样使用

    // 正确的使用strlen是通过指针指向的字符串
    std::cout << "Length of string pointed by pointer: " << strlen(ptr) << std::endl;

    return 0;
}

输出结果

Size of array (in bytes): 14
Length of string: 13
Size of pointer (in bytes): 8  // 这取决于系统架构,32位系统可能是4字节,64位系统通常是8字节
Length of string pointed by pointer: 13

解释

  1. sizeof(str)返回的是字符数组str所占用的总字节数,包括结尾的空字符。在这个例子中,字符数组str包含13个字符加上1个空字符,总共14个字节。
  2. strlen(str)返回的是字符串str的长度,不包括结尾的空字符。因此,结果是13。
  3. sizeof(ptr)返回的是指针变量ptr所占用的字节数,这取决于系统架构。在64位系统上,指针通常是8字节。
  4. strlen(ptr)正确地返回了指针指向的字符串的长度,即13。注意,这里不能直接对指针使用sizeof来获取字符串的长度,因为sizeof(ptr)返回的是指针本身的大小,而不是它指向的数据的大小。

总结

  • sizeof是一个编译时运算符,用于获取变量或数据类型的大小。
  • strlen是一个运行时函数,用于计算C风格字符串的长度。
  • sizeof可以用于任何数据类型,而strlen只能用于C风格字符串。
  • 使用sizeof时要注意它返回的是整个数据类型或变量的大小,而不仅仅是数据的长度。
  • 使用strlen时要确保传入的是有效的C风格字符串,否则会导致未定义行为。


Qt教程
致力于Qt教程,Qt技术交流,研发
 最新文章