| name | C语言编程 |
| description | 当进行C语言开发、性能优化、内存管理或系统编程时,分析代码质量、设计模式和最佳实践。 |
| license | MIT |
C语言编程技能
概述
C语言是系统编程的基础,提供了接近硬件的能力和极高的性能。不当的内存管理、指针使用和资源管理会导致严重的安全问题、内存泄漏和崩溃。
核心原则: 好的C代码应该高效可靠、内存安全、资源管理清晰、易于维护。坏的C代码会内存泄漏、指针混乱、安全漏洞百出。
何时使用
始终:
- 系统编程和嵌入式开发
- 性能关键代码优化
- 内存管理审查
- 指针和资源生命周期分析
- 代码质量检查
- 安全审计
触发短语:
- "C内存管理最佳实践"
- "如何避免内存泄漏?"
- "指针使用规范"
- "C性能优化技巧"
- "资源管理模式"
- "C安全编码"
C语言技能功能
内存管理
- malloc/free正确性检查
- 内存泄漏检测
- 缓冲区溢出防护
- 野指针识别
- 内存对齐优化
指针操作
- 指针声明和定义规范
- 指针算术安全
- 二级指针应用
- 函数指针使用
- 指针转换规范
资源管理
- 文件I/O管理
- 动态内存分配
- 资源生命周期
- RAII模式(变通实现)
- 异常安全
代码质量
- 复杂度分析
- 循环和条件优化
- 重复代码检测
- 命名规范检查
- 代码风格统一
并发与线程
- POSIX线程概念
- 临界区保护
- 互斥锁使用
- 条件变量
- 竞态条件检测
常见问题
内存问题
指针问题
-
问题: 指针错用
-
原因: 不清楚指针和数组的关系
-
解决: 明确区分指针和数组,避免混淆
-
问题: 指针转换不当
-
原因: 类型和大小不匹配
-
解决: 进行显式转换检查,使用sizeof验证
代码示例
安全的内存管理
int* create_array(size_t size) {
if (size == 0 || size > 1000000) {
return NULL;
}
int* array = (int*)malloc(size * sizeof(int));
if (array == NULL) {
perror("malloc failed");
return NULL;
}
return array;
}
void safe_string_copy(char* dest, const char* src, size_t dest_size) {
if (dest == NULL || src == NULL || dest_size == 0) {
return;
}
strncpy(dest, src, dest_size - 1);
dest[dest_size - 1] = '\0';
}
int main() {
int* array = create_array(100);
if (array == NULL) return 1;
for (int i = 0; i < 100; i++) {
array[i] = i * i;
}
free(array);
array = NULL;
return 0;
}
文件I/O安全管理
int read_file_safely(const char* filename, char* buffer, size_t buffer_size) {
FILE* fp = fopen(filename, "r");
if (fp == NULL) {
perror("fopen failed");
return -1;
}
if (fgets(buffer, buffer_size, fp) == NULL) {
perror("fgets failed");
fclose(fp);
return -1;
}
fclose(fp);
return 0;
}
typedef struct {
char name[50];
int age;
float salary;
} Employee;
Employee* create_employee(const char* name, int age, float salary) {
Employee* emp = (Employee*)malloc(sizeof(Employee));
if (emp == NULL) return NULL;
safe_string_copy(emp->name, name, sizeof(emp->name));
emp->age = age;
emp->salary = salary;
return emp;
}
void free_employee(Employee* emp) {
free(emp);
}
指针和数组关系
void pointer_and_array_demo() {
int arr[5] = {1, 2, 3, 4, 5};
int* ptr = arr;
printf("arr[0] = %d\n", arr[0]);
printf("*ptr = %d\n", *ptr);
printf("ptr[0] = %d\n", ptr[0]);
printf("*(ptr+1) = %d\n", *(ptr+1));
printf("sizeof(arr) = %lu\n", sizeof(arr));
printf("sizeof(ptr) = %lu\n", sizeof(ptr));
}
void print_array(int arr[], size_t size) {
for (size_t i = 0; i < size; i++) {
printf("%d ", arr[i]);
}
printf("\n");
}