文章目录
qia
面试问题
1. new
和 malloc
new
:是C++中的运算符,用于动态分配内存,并调用对象的构造函数。它返回一个对象指针。malloc
:是C语言标准库函数,用于动态分配指定大小的内存块,不调用构造函数。它返回一个指向分配内存的指针。
2. malloc(1.2G)
在1G内存的计算机中
不能。因为malloc
会尝试分配大约1.2GB的内存,而系统的总内存仅为1GB,这超出了计算机的物理内存限制,导致分配失败。
3. extern "C"
的作用
用于指示编译器这部分代码是用C语言链接约定编写的,通常用于C++代码中调用C语言库。
4. 字符串函数导致内存溢出
strcat
和strcpy
:在不检查目标缓冲区大小的情况下,可能会导致溢出。- 改进:使用
strncat
和strncpy
,并确保目标缓冲区足够大。
5. static
的用法
- 定义:限制变量或函数的可见性和生命周期。
- 用途:用于创建全局变量、静态变量、静态成员变量和静态成员函数。
6. const
的用法
- 定义:修饰变量或函数参数,表示它们的值不可更改。
- 用途:用于常量定义、常量指针和指针常量,以及函数参数,以保证函数不会修改参数值。
7. volatile
作用和用法
- 作用:告诉编译器不要优化这个变量的访问,因为它可能会在程序的控制之外被改变(如硬件设备)。
- 用法:用于修饰变量。
8. const
常量和 #define
- 编译阶段:
const
在编译时处理,#define
在预处理阶段处理。 - 安全性:
const
更安全,因为它是类型安全的,而#define
不是。 - 内存占用:
const
变量会占用内存,#define
只是文本替换,不占用内存。
9. 变量的作用域
- 全局变量:在函数外部定义,整个程序中可见。
- 局部变量:在函数内部定义,只在该函数内部可见。
10. sizeof
与 strlen
sizeof
:返回数据类型或变量占用的字节数。strlen
:返回字符串的长度(不包括终止的空字符)。
11. sizeof(struct)
和 sizeof(union)
内存对齐
struct
:可能包含填充字节,以确保成员对齐。union
:大小等于最大成员的大小,没有填充。
12. inline
函数
用于修饰小型函数,建议编译器在每次调用时内联函数代码,而不是进行函数调用,以减少调用开销。
13. 内存四区
- 代码区:存放程序的二进制代码。
- 全局/静态区:存放全局变量和静态变量。
- 堆区:动态内存分配,如
malloc
和new
。 - 栈区:存放局部变量和函数调用的上下文。
14. 判断机器大小端
可以通过编写一个简单的C程序来检测:
#include <stdio.h>
int main() {
unsigned int x = 1;
char *c = (char*)&x;
if (*c) {
printf("Little endian\n");
} else {
printf("Big endian\n");
}
return 0;
}
15. 变量 a
的定义
int a; // 定义一个整型变量a
16. 与或非,异或运算符优先级
运算符优先级从高到低依次是:
- 非 (
!
) - 与 (
&&
) - 或 (
||
) - 异或 (
^
)
这些运算符用于布尔逻辑运算,其中 &&
和 ||
是短路运算符,即如果第一个操作数可以确定整个表达式的结果,则第二个操作数不会被评估。