目录
-
-
- 2.1 C 和 C++ 的区别、概念相关面试题
-
- 2.1.1 **new 和 malloc 的区别** ⭐⭐⭐⭐⭐
- 2.1.2 **malloc 的底层实现** ⭐⭐⭐⭐
- 2.1.3 **在 1G 内存的计算机中能否 malloc(1.2G)?为什么?** ⭐⭐
- 2.1.4 **指针与引用的相同和区别;如何相互转换?** ⭐⭐⭐⭐⭐
- 2.1.5 **C 语言检索内存情况,内存分配的方式** ⭐⭐⭐
- 2.1.6 **`extern "C"` 的作用** ⭐⭐⭐
- 2.1.7 **头文件声明时加 extern 定义时不要加 因为 extern 可以多次声明,但只有一个定义** ⭐⭐⭐⭐
- 2.1.8 **函数参数压栈顺序,即关于 `__stdcall` 和 `__cdecl` 调用方式的理解** ⭐⭐⭐
- 2.1.9 **重写 `memcpy()` 函数需要注意哪些问题** ⭐⭐
- 2.1.10 **数组到底存放在哪里** ⭐⭐⭐
- 2.1.11 **`struct` 和 `class` 的区别** ⭐⭐⭐⭐⭐
- 2.1.12 **`char` 和 `int` 之间的转换** ⭐⭐⭐
- 2.1.13 **`static` 的用法(定义和用途)** ⭐⭐⭐⭐⭐
- 2.1.14 **`const` 常量和 `#define` 的区别(编译阶段、安全性、内存占用等)** ⭐⭐⭐⭐
- 2.1.16 **`volatile` 的作用和用法** ⭐⭐⭐⭐⭐
- 2.1.17 **有常量指针、指针常量、常量引用,没有引用常量** ⭐⭐⭐
- 2.1.18 **没有指向引用的指针,因为引用是没有地址的,但有指针的引用** ⭐⭐⭐
- 2.1.19 **C/C++ 中变量的作用域** ⭐⭐⭐⭐⭐
- 2.1.20 **C++ 中类型转换机制?各适用什么环境?`dynamic_cast` 转换失败时会出现什么情况?** ⭐⭐⭐
-
2.1 C 和 C++ 的区别、概念相关面试题
2.1.1 new 和 malloc 的区别 ⭐⭐⭐⭐⭐
- new 是 C++ 的运算符,malloc 是 C 语言的库函数。
- new:
- 会调用构造函数来初始化对象,并返回具体的对象指针。
- 返回对象的实际类型,不需要进行强制类型转换。
- 内存分配失败时会抛出异常
std::bad_alloc
。
- malloc:
- 仅仅分配内存,不调用构造函数进行初始化。
- 需要强制转换返回的
void*
类型指针。 - 内存分配失败时返回
NULL
。 malloc
只分配内存,free 用于释放。new
配合 delete 使用,自动调用析构函数。
2.1.2 malloc 的底层实现 ⭐⭐⭐⭐
malloc
的底层实现主要依赖于操作系统提供的 brk() 或 mmap() 系统调用。它们可以向内核申请动态内存。内存通常来自堆区,通过链表或分块的方式进行管理。具体实现通常会使用 glibc 中的 ptmalloc 或其他类似算法。它们通过分配内存块和合并空闲内存来提高效率。
2.1.3 在 1G 内存的计算机中能否 malloc(1.2G)?为什么? ⭐⭐
不一定能成功。因为 malloc 分配的是虚拟内存,并不要求物理内存立即足够,但这也依赖于操作系统的虚拟内存管理和交换空间(swap)。操作系统可以使用虚拟内存技术分配超过物理内存大小的空间,但如果超过了系统可用虚拟内存的范围,malloc 就会失败,返回 NULL
。
2.1.4 指针与引用的相同和区别;如何相互转换? ⭐⭐⭐⭐⭐
-
相同点:
- 都可以用于操作其他变量或对象。
-
区别:
- 指针:
- 可以改变所指向的对象。
- 可以是
NULL
,不一定指向有效对象。 - 使用
*
访问指向的对象,使用&
获取变量地址。</
- 指针: