用 Codex 或 Claude 帮你安装 复制这段 Prompt,粘贴到 Codex、Claude 或其他助手里,让它检查 Skill 页面并帮你完成安装。
直接命令不会经过审查 Prompt;运行前请先检查来源。
npx skills add https://github.com/microwind/ai-skills --skill c命令会保持在同一行。复制前请横向滚动并检查完整内容。
想先保存到本地?可下载 SkillsMP 当前能够提供的文件。
基于 SOC 职业分类
正在显示 SKILL.md
| name | C语言编程 |
| description | 当进行C语言开发、性能优化、内存管理或系统编程时,分析代码质量、设计模式和最佳实践。 |
| license | MIT |
C语言是系统编程的基础,提供了接近硬件的能力和极高的性能。不当的内存管理、指针使用和资源管理会导致严重的安全问题、内存泄漏和崩溃。
核心原则: 好的C代码应该高效可靠、内存安全、资源管理清晰、易于维护。坏的C代码会内存泄漏、指针混乱、安全漏洞百出。
始终:
触发短语:
问题: 内存泄漏
原因: malloc后没有正确free
解决: 配对检查malloc/free,使用工具检测
问题: 缓冲区溢出
原因: 数组越界访问
解决: 使用数组长度检查,避免strcpy等不安全函数
问题: 野指针访问
原因: 使用已释放的指针
解决: 释放后立即设置为NULL,避免重复释放
问题: 指针错用
原因: 不清楚指针和数组的关系
解决: 明确区分指针和数组,避免混淆
问题: 指针转换不当
原因: 类型和大小不匹配
解决: 进行显式转换检查,使用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'; // 确保null terminator
}
// 使用示例
int main() {
int* array = create_array(100);
if (array == NULL) return ;
( i = ; i < ; i++) {
[i] = i * i;
}
();
= ;
;
}
// 文件读取安全处理
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;
}
// 使用fgets确保缓冲区安全
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]); // 1
printf("*ptr = %d\n", *ptr); // 1
printf("ptr[0] = %d\n", ptr[0]); // 1
printf("*(ptr+1) = %d\n", *(ptr+1)); // 2
// 但是 sizeof会给出不同结果
printf("sizeof(arr) = %lu\n", sizeof(arr)); // 20 (5*4)
printf("sizeof(ptr) = %lu\n", sizeof(ptr)); // 8 (指针大小)
}
// 函数参数中数组退化为指针
void print_array(int arr[], size_t size) {
// 注意:在函数参数中,arr是指针,不是数组
// 所以必须单独传递size参数
for (size_t i = 0; i < size; i++) {
printf("%d ", arr[i]);
}
printf("\n");
}