面试题答案
一键面试常见错误及举例
- 内存泄漏
- 举例:
#include <stdio.h>
#include <stdlib.h>
typedef struct {
int data;
} MyStruct;
int main() {
MyStruct* structPool = (MyStruct*)malloc(10 * sizeof(MyStruct));
if (structPool == NULL) {
perror("malloc");
return 1;
}
// 这里没有调用free(structPool)
return 0;
}
- **原因**:分配了内存但未释放,导致这块内存一直被占用,直到程序结束。
- **避免方法**:在程序结束前,确保调用`free(structPool)`释放分配的内存。
2. 双重释放 - 举例:
#include <stdio.h>
#include <stdlib.h>
typedef struct {
int data;
} MyStruct;
int main() {
MyStruct* structPool = (MyStruct*)malloc(10 * sizeof(MyStruct));
if (structPool == NULL) {
perror("malloc");
return 1;
}
free(structPool);
free(structPool); // 双重释放
return 0;
}
- **原因**:对已经释放的内存再次调用`free`函数,这会导致未定义行为。
- **避免方法**:释放内存后,将指针设置为`NULL`,如`free(structPool); structPool = NULL;`,这样再次尝试释放时,`free(NULL)`是安全的操作,不会引发错误。
3. 释放未分配的内存 - 举例:
#include <stdio.h>
#include <stdlib.h>
typedef struct {
int data;
} MyStruct;
int main() {
MyStruct* structPool;
free(structPool); // 释放未分配的内存
return 0;
}
- **原因**:试图释放一个没有通过`malloc`(或类似内存分配函数)分配的指针,同样会导致未定义行为。
- **避免方法**:在使用指针前,确保它已经通过合法的内存分配函数进行了分配。
4. 内存分配失败未处理 - 举例:
#include <stdio.h>
#include <stdlib.h>
typedef struct {
int data;
} MyStruct;
int main() {
MyStruct* structPool = (MyStruct*)malloc(10 * sizeof(MyStruct));
// 没有检查malloc是否分配成功就继续使用structPool
structPool[0].data = 10;
return 0;
}
- **原因**:`malloc`可能由于系统内存不足等原因分配失败并返回`NULL`,如果不检查就继续使用,会导致程序崩溃。
- **避免方法**:在调用`malloc`后立即检查返回值,如:
MyStruct* structPool = (MyStruct*)malloc(10 * sizeof(MyStruct));
if (structPool == NULL) {
perror("malloc");
return 1;
}