interview
c-basics
C 中 sizeof 和 strlen 的区别

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

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

QA

Step 1

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

A:: sizeof 是一个编译时运算符,用于获取数据类型或对象在内存中所占的字节数。它适用于所有数据类型,包括基本数据类型、结构体、类等。strlen 是一个函数,用于计算以 null 结尾的字符串的长度(不包括结尾的 null 字符),其返回值为字符串中字符的数量。sizeof 是在编译时确定的,返回的结果是一个整数常量,而 strlen 是在运行时确定的,返回的结果是一个 size_t 类型的值。

Step 2

Q:: sizeof 能用于动态分配的内存块吗?

A:: 不能。sizeof 只能计算编译时已知的类型或对象的大小,无法确定动态分配内存的大小。如果你需要知道动态分配内存块的大小,需要通过其他方法(如记录分配时的大小)。

Step 3

Q:: strlen 如果传入非 null 终止的字符串会发生什么?

A:: strlen 依赖于 null 字符来确定字符串的结束。如果传入的字符串没有 null 终止符,strlen 会继续读取内存,直到遇到一个意外的 null 字符,这可能会导致未定义行为,如内存泄漏或程序崩溃。

Step 4

Q:: sizeof 在使用时有哪些常见的误区?

A:: 常见误区包括:1)将 sizeof 用于指针时,它返回的是指针本身的大小,而不是指针所指向数据的大小;2)在处理动态数组时,sizeof 返回的是指针的大小,而不是数组元素的总大小;3)对于自定义类型,sizeof 返回的是包含填充字节的总大小,而不是成员变量的大小之和。

Step 5

Q:: strlen 为什么不能用于非字符串数组?

A:: 因为 strlen 是专门为 C 风格的字符串设计的,它要求输入必须是一个以 null 结尾的字符数组。如果用于非字符串数组(如整数数组),strlen 无法找到 null 终止符,结果会导致错误的内存访问或崩溃。

用途

sizeof 和 strlen 是 C`++` 中非常基础的概念,了解它们的区别对于正确管理内存和字符串操作非常重要。在生产环境中,当你处理底层内存操作、进行系统编程、或者需要优化性能时,正确使用 sizeof 可以帮助你避免内存泄漏和其他潜在的错误。strlen 主要用于字符串处理,当需要计算字符串长度时,这是一个常用函数。掌握这些概念有助于编写更健壮和高效的代码。\n

相关问题

🦆
C++ 中的指针和引用有什么区别?

指针是一个变量,存储了另一个变量的内存地址。引用是一个别名,直接指向另一个变量。指针可以为空(null),可以进行算术运算,而引用一旦初始化后不能改变指向,且不能为 null。指针和引用的区别在处理对象、内存管理和函数参数传递时非常重要。

🦆
C++ 中动态内存分配如何管理?

C++ 使用 new 和 delete 操作符进行动态内存分配和释放。new 在堆上分配内存并返回指向该内存的指针,而 delete 释放之前分配的内存。使用动态内存时需要小心管理,避免内存泄漏和双重释放。智能指针(如 std::unique_ptr, std::shared_ptr)可以帮助自动管理内存。

🦆
C++ 中浅拷贝和深拷贝的区别是什么?

浅拷贝复制对象的成员变量的值,如果成员变量是指针,则复制指针的地址,导致两个对象共享同一块内存。深拷贝不仅复制成员变量,还复制指针所指向的内存,保证两个对象有独立的内存空间。浅拷贝在资源管理不当时容易导致内存泄漏、悬空指针等问题。

🦆
C++ 中如何实现 RAII资源获取即初始化?

RAII 是一种管理资源(如内存、文件句柄等)的编程惯用法。资源在对象创建时分配,在对象销毁时释放。C++ 通过构造函数和析构函数实现 RAII。智能指针、std::vector 等标准库容器都利用了 RAII 原则来自动管理资源,避免手动释放资源的麻烦和错误。