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 终止符,结果会导致错误的内存访问或崩溃。