interview
cpp-basics
C++中sizeof和strlen的区别?

C++基础面试题, C++ 中 sizeof 和 strlen 的区别?

C++基础面试题, C++ 中 sizeof 和 strlen 的区别?

QA

Step 1

Q:: C++ 中 sizeof 和 strlen 的区别?

A:: sizeof 是一个编译时运算符,用于计算数据类型或变量所占的内存大小(以字节为单位)。它的计算是在编译阶段完成的,并且包括了内存对齐的额外字节。strlen 是一个函数,用于计算 C 风格字符串(以 '\0' 结尾的字符数组)的长度,返回值为字符串中实际字符的个数,不包括终止符 '\0'

Step 2

Q:: sizeof 计算指针类型的大小是多少?

A:: 在 64 位系统上,sizeof 一个指针类型(例如 int*)通常是 8 字节,在 32 位系统上通常是 4 字节。sizeof 计算的是指针本身所占内存的大小,而不是它指向的对象的大小。

Step 3

Q:: strlen 在处理非以 '\0' 结尾的字符数组时会发生什么?

A:: strlen 会继续读取内存,直到找到 '\0' 字符为止,这可能导致未定义行为,包括读取超出数组边界的内存。这是因为 strlen 并没有获取数组的长度,而是通过遍历找到终止符 '\0' 来计算长度。

用途

sizeof 和 strlen 的区别是面试中常见的问题,因为它们涉及到内存管理和字符串处理,这是 C`++` 编程中至关重要的内容。在实际生产环境中,开发者在处理内存敏感的应用程序时(例如嵌入式系统、操作系统内核、性能关键的应用)需要准确掌握 sizeof 的使用,以确保内存分配的准确性。strlen 则常用于处理字符串相关的逻辑,例如文本处理、输入输出、文件解析等,需要注意其对字符串格式的要求。\n

相关问题

🦆
如何计算一个结构体的大小?

可以使用 sizeof 操作符来计算一个结构体的大小。结构体的大小不仅取决于其中的各个成员,还可能受到内存对齐的影响。编译器可能会在结构体的成员之间插入填充字节,以保证成员在内存中的对齐。这些填充字节也会被 sizeof 计算在内。

🦆
C++ 中 char 数组和 std::string 的区别是什么?

char 数组是一种 C 风格的字符串,它的长度是固定的,并且以 '\0' 作为字符串的结束标志。而 std::string 是 C++ 标准库提供的字符串类,具备更高层次的封装,支持动态增长、字符串操作函数、运算符重载等功能,使字符串处理更加方便和安全。

🦆
C++ 中内存对齐的概念是什么?

内存对齐是指数据在内存中的存放方式,以确保高效的内存访问。编译器通常会在数据成员之间插入填充字节,以使每个成员的地址符合其对齐要求,从而优化内存访问速度。内存对齐不仅影响数据结构的大小,还可能影响程序的性能。

🦆
C++ 中如何安全地处理动态内存分配?

动态内存分配可以使用 new 和 delete 进行分配和释放。为了避免内存泄漏,必须确保每个 new 对应一个 delete。此外,C++11 引入了智能指针(例如 std::unique_ptr 和 std::shared_ptr),它们可以自动管理动态内存的生命周期,降低内存泄漏的风险。