Token导航 LogoToken导航

Agent Skill · AI 工具

c-memory-management(C 语言内存管理)

c-memory-management 用于处理 GitHub 仓库、Issue、Pull Request 和代码协作信息,适合在 Codex、Claude、Cursor、Gemini CLI 中需要围绕仓库状态、代码变更或协作事项进行整理时使用。可结合来源仓库、安装命令和原始 README 继续核验具体用法。安装前建议确认权限范围、维护状态,以及是否会触发联网、命令执行或文件读写。

c-memory-management 是AI 工具类 Agent Skill,可用宿主为 Codex、Claude、Cursor、Gemini CLI,通过GitHub 仓库获取,权限为调用外部服务;许可证为 MIT,第三方扫描已通过,按安装量在AI 工具类的 2,536 个 Skill 里排第 1,532。

总安装 636周安装 26GitHub Stars 142下载 204核验 2026-05-01

安装说明

本站只整理中文说明,不托管安装包,也不代用户安装。
GitHub
许可证
MIT

安装方式

通过对话安装

复制提示词发给支持本地命令或 Skills 的 AI 助手,先确认命令和权限,再让它执行。

请帮我安装这个 Agent Skill:c-memory-management(C 语言内存管理)
来源仓库:https://github.com/thebushidocollective/han
仓库路径:skills/c-memory-management
安装命令:
npx skills add https://github.com/thebushidocollective/han --skill c-memory-management
安装前请先检查当前环境是否支持对应 CLI,并向我确认将要执行的命令、安装目录、联网范围和文件读写权限;确认后再执行。

命令行安装

复制命令到本机终端执行。不同来源提供的安装方式可能略有差异;本站展示可直接复制的安装命令,安装前请核对来源页面。

skills.shnpx skills
npx skills add https://github.com/thebushidocollective/han --skill c-memory-management

这个 Skill 是做什么的

AI 工具类 Skill 用来扩展助手本身的能力,例如接模型、接检索、接外部服务。

用于掌握 C 语言手动内存管理,包括分配、释放和指针处理。适用于 Codex、Claude、Cursor、Gemini CLI,防止内存泄漏和损坏。提供调试工具和最佳实践,如 valgrind 和 AddressSanitizer。

安装方式:github,命令为 npx skills add https://github.com/thebushidocollective/han --skill c-memory-management。建议确认编译器和调试工具可用性,确保内存安全。

来源仓库内路径:skills/c-memory-management

上手步骤

4 步
  1. 1

    确认自己的宿主工具

    公开资料标注支持 Codex、Claude、Cursor、Gemini CLI;先确认自己用的是其中之一,再按对应工具的 Skills 目录放置。

  2. 2

    拿到安装命令

    可以直接复制的命令是 npx skills add https://github.com/thebushidocollective/han --skill c-memory-mana…;命令里的占位符换成自己的路径或密钥再执行。

  3. 3

    安装后重启宿主

    命令执行完要完全退出宿主工具再打开,让新装的 Skill 被重新扫描到,否则列表里可能看不到。

  4. 4

    按最小权限试用

    它需要调用外部服务,先在测试目录或测试账号里跑,确认没问题再放到正式项目。

常见问题

6 条

c-memory-management 怎么安装?

在终端执行 npx skills add https://github.com/thebushidocollective/han --skill c-memory-management。装完完全退出宿主工具再打开,让它重新扫描本地 Skill。

c-memory-management 支持哪些 AI 工具?

公开资料标注支持 Codex、Claude、Cursor、Gemini CLI。其他工具只要能读取本地 Skill 目录,一般也能手动放进去,但要自己确认触发方式是否一致。

c-memory-management 需要什么权限?

权限级别是调用外部服务。该 Skill 可能调用第三方服务、云服务或外部模型 API,使用前需要确认账号、额度、数据发送范围和服务条款。

c-memory-management 是免费的吗?

来源标注的许可证是 MIT。本站不代收任何费用,也不托管安装包;能否商用、要不要署名,以许可证原文为准。

c-memory-management 用的人多吗?

公开数据是累计安装 636 次,近一周安装 26 次,下载 204 次,GitHub 142 星。这些数字来自第三方目录统计,只能当作热度参考,不代表质量或安全性。

c-memory-management 安全吗?

第三方扫描结果为通过,但这只覆盖已知的静态检查项,不能替代自己读一遍源码和安装命令。

值得选的地方和要先想清楚的地方

值得选的地方

  • 同时适配 4 种工具,换客户端不用重新找替代品。
  • 3 个目录同时收录,说明这个 Skill 流传比较广。
  • 许可证明确为 MIT,商用和分发边界好判断。
  • 第三方扫描已通过,常见的高风险行为没有命中。

先想清楚的地方

  • 第三方目录整理,版本更新和行为细节以来源仓库为准。

适不适合你

更适合

  • 已经在用 Codex,想直接扩展它能力的人。
  • 需要处理AI 工具类任务、又不想每次都手写提示词的人。
  • 需要许可证清楚、并且有第三方扫描结果的团队项目。

不太适合

  • 需要厂商级技术支持和 SLA 的生产系统。

AI 工具类 Skill 对比

6 个同类
Skill总安装GitHub 星权限许可证扫描
executing-plans

执行计划 · Codex、Claude

1,515,336173,110只读MIT通过
verification-before-completion

完成前的验证 · Codex、Claude

1,319,472173,121权限未标注MIT通过
subagent-driven-development

子 Agent 驱动开发 · Codex、Claude

1,312,416173,138只读MIT通过
copy-editing

复制编辑 · Codex、Claude

1,209,57625,632只读MIT通过
paywall-upgrade-cro

付费专区升级 cro · Codex、Claude

1,030,17625,617只读MIT通过
c-memory-management

C 语言内存管理 · 本页

636142调用外部服务MIT通过

按安装量取同分类前几名;数字来自第三方目录统计,只作热度参考,不代表质量结论。

SKILL.md 原文

C Memory Management

Master manual memory management in C with proper allocation, deallocation, pointer handling, and techniques to avoid memory leaks and corruption.

Overview

C requires manual memory management through explicit allocation and deallocation. Understanding pointers, the heap, and proper memory handling is crucial for writing safe and efficient C programs.

Installation and Setup

Compiler and Tools

# Install GCC compiler
# macOS
xcode-select --install

# Linux (Ubuntu/Debian)
sudo apt-get install build-essential

# Check installation
gcc --version

# Memory debugging tools
# Install Valgrind (Linux)
sudo apt-get install valgrind

# Install Address Sanitizer (built into GCC/Clang)
gcc -fsanitize=address -g program.c -o program

Compilation Flags

# Basic compilation
gcc program.c -o program

# With warnings and debugging
gcc -Wall -Wextra -g program.c -o program

# With Address Sanitizer
gcc -fsanitize=address -g program.c -o program

# With optimization
gcc -O2 -Wall program.c -o program

Core Patterns

1. Dynamic Memory Allocation

// malloc - allocate memory
#include <stdlib.h>
#include <string.h>

int* allocate_array(size_t size) {
    int* arr = malloc(size * sizeof(int));
    if (arr == NULL) {
        return NULL;  // Allocation failed
    }
    return arr;
}

// calloc - allocate and zero-initialize
int* allocate_zeroed_array(size_t size) {
    int* arr = calloc(size, sizeof(int));
    if (arr == NULL) {
        return NULL;
    }
    return arr;
}

// realloc - resize allocation
int* resize_array(int* arr, size_t old_size, size_t new_size) {
    int* new_arr = realloc(arr, new_size * sizeof(int));
    if (new_arr == NULL && new_size > 0) {
        // Reallocation failed, original array still valid
        return NULL;
    }
    return new_arr;
}

// free - deallocate memory
void cleanup_array(int** arr) {
    if (arr != NULL && *arr != NULL) {
        free(*arr);
        *arr = NULL;  // Prevent dangling pointer
    }
}

2. Pointer Basics

// Pointer declaration and usage
void pointer_basics() {
    int value = 42;
    int* ptr = &value;  // ptr points to value

    printf("Value: %d\n", value);
    printf("Address: %p\n", (void*)&value);
    printf("Pointer: %p\n", (void*)ptr);
    printf("Dereferenced: %d\n", *ptr);

    *ptr = 100;  // Modify through pointer
    printf("New value: %d\n", value);
}

// Null pointers
void null_pointer_check(int* ptr) {
    if (ptr == NULL) {
        printf("Null pointer\n");
        return;
    }
    printf("Valid pointer: %d\n", *ptr);
}

// Pointer arithmetic
void pointer_arithmetic() {
    int arr[] = {10, 20, 30, 40, 50};
    int* ptr = arr;

    for (int i = 0; i < 5; i++) {
        printf("%d ", *(ptr + i));  // Same as ptr[i]
    }
    printf("\n");
}

3. Dynamic Strings

#include <string.h>

// Create string copy
char* string_duplicate(const char* str) {
    if (str == NULL) {
        return NULL;
    }

    size_t len = strlen(str);
    char* copy = malloc(len + 1);  // +1 for null terminator

    if (copy != NULL) {
        strcpy(copy, str);
    }

    return copy;
}

// String concatenation
char* string_concat(const char* s1, const char* s2) {
    if (s1 == NULL || s2 == NULL) {
        return NULL;
    }

    size_t len1 = strlen(s1);
    size_t len2 = strlen(s2);

    char* result = malloc(len1 + len2 + 1);
    if (result == NULL) {
        return NULL;
    }

    strcpy(result, s1);
    strcat(result, s2);

    return result;
}

// Safe string functions
char* safe_string_copy(const char* src, size_t max_len) {
    if (src == NULL) {
        return NULL;
    }

    size_t len = strnlen(src, max_len);
    char* dest = malloc(len + 1);

    if (dest != NULL) {
        memcpy(dest, src, len);
        dest[len] = '\0';
    }

    return dest;
}

4. Structures and Memory

// Structure with dynamic members
typedef struct {
    char* name;
    int* scores;
    size_t num_scores;
} Student;

Student* create_student(const char* name, size_t num_scores) {
    Student* student = malloc(sizeof(Student));
    if (student == NULL) {
        return NULL;
    }

    student->name = string_duplicate(name);
    if (student->name == NULL) {
        free(student);
        return NULL;
    }

    student->scores = malloc(num_scores * sizeof(int));
    if (student->scores == NULL) {
        free(student->name);
        free(student);
        return NULL;
    }

    student->num_scores = num_scores;
    memset(student->scores, 0, num_scores * sizeof(int));

    return student;
}

void destroy_student(Student** student) {
    if (student == NULL || *student == NULL) {
        return;
    }

    free((*student)->name);
    free((*student)->scores);
    free(*student);
    *student = NULL;
}

5. Memory Pools

// Simple memory pool
typedef struct {
    void* pool;
    size_t block_size;
    size_t num_blocks;
    size_t next_free;
} MemoryPool;

MemoryPool* create_pool(size_t block_size, size_t num_blocks) {
    MemoryPool* pool = malloc(sizeof(MemoryPool));
    if (pool == NULL) {
        return NULL;
    }

    pool->pool = malloc(block_size * num_blocks);
    if (pool->pool == NULL) {
        free(pool);
        return NULL;
    }

    pool->block_size = block_size;
    pool->num_blocks = num_blocks;
    pool->next_free = 0;

    return pool;
}

void* pool_allocate(MemoryPool* pool) {
    if (pool == NULL || pool->next_free >= pool->num_blocks) {
        return NULL;
    }

    void* block = (char*)pool->pool + (pool->next_free * pool->block_size);
    pool->next_free++;

    return block;
}

void destroy_pool(MemoryPool** pool) {
    if (pool == NULL || *pool == NULL) {
        return;
    }

    free((*pool)->pool);
    free(*pool);
    *pool = NULL;
}

6. Reference Counting

// Reference counted string
typedef struct {
    char* data;
    size_t ref_count;
} RefString;

RefString* refstring_create(const char* str) {
    RefString* rs = malloc(sizeof(RefString));
    if (rs == NULL) {
        return NULL;
    }

    rs->data = string_duplicate(str);
    if (rs->data == NULL) {
        free(rs);
        return NULL;
    }

    rs->ref_count = 1;
    return rs;
}

RefString* refstring_retain(RefString* rs) {
    if (rs != NULL) {
        rs->ref_count++;
    }
    return rs;
}

void refstring_release(RefString** rs) {
    if (rs == NULL || *rs == NULL) {
        return;
    }

    (*rs)->ref_count--;

    if ((*rs)->ref_count == 0) {
        free((*rs)->data);
        free(*rs);
    }

    *rs = NULL;
}

7. Memory Debugging

// Debug wrapper for malloc
#ifdef DEBUG_MEMORY
typedef struct {
    void* ptr;
    size_t size;
    const char* file;
    int line;
} AllocationInfo;

static AllocationInfo allocations[1000];
static size_t num_allocations = 0;

void* debug_malloc(size_t size, const char* file, int line) {
    void* ptr = malloc(size);
    if (ptr != NULL && num_allocations < 1000) {
        allocations[num_allocations].ptr = ptr;
        allocations[num_allocations].size = size;
        allocations[num_allocations].file = file;
        allocations[num_allocations].line = line;
        num_allocations++;
    }
    return ptr;
}

void debug_free(void* ptr) {
    for (size_t i = 0; i < num_allocations; i++) {
        if (allocations[i].ptr == ptr) {
            allocations[i] = allocations[num_allocations - 1];
            num_allocations--;
            break;
        }
    }
    free(ptr);
}

void print_leaks() {
    printf("Memory leaks: %zu\n", num_allocations);
    for (size_t i = 0; i < num_allocations; i++) {
        printf("  %p (%zu bytes) at %s:%d\n",
               allocations[i].ptr,
               allocations[i].size,
               allocations[i].file,
               allocations[i].line);
    }
}

#define malloc(size) debug_malloc(size, __FILE__, __LINE__)
#define free(ptr) debug_free(ptr)
#endif

8. Stack vs Heap

// Stack allocation
void stack_example() {
    int local_var = 42;  // Stack
    char buffer[100];    // Stack

    // Automatically freed when function returns
}

// Heap allocation
void heap_example() {
    int* dynamic = malloc(sizeof(int));  // Heap
    if (dynamic != NULL) {
        *dynamic = 42;
        free(dynamic);  // Must manually free
    }
}

// Mixed allocation
typedef struct {
    int id;                  // Stack (part of struct)
    char* name;             // Heap (pointer to heap)
} Record;

Record* create_record(int id, const char* name) {
    Record* rec = malloc(sizeof(Record));  // Heap
    if (rec == NULL) {
        return NULL;
    }

    rec->id = id;  // Stack value
    rec->name = string_duplicate(name);  // Heap

    if (rec->name == NULL) {
        free(rec);
        return NULL;
    }

    return rec;
}

9. Double Free Prevention

// Safe free macro
#define SAFE_FREE(ptr) do { \
    if (ptr != NULL) { \
        free(ptr); \
        ptr = NULL; \
    } \
} while(0)

// Usage
void safe_cleanup() {
    int* arr = malloc(10 * sizeof(int));

    // ... use arr ...

    SAFE_FREE(arr);
    // arr is now NULL, can safely call again
    SAFE_FREE(arr);  // No-op, safe
}

// Reference clearing
void clear_reference(void** ref) {
    if (ref != NULL && *ref != NULL) {
        free(*ref);
        *ref = NULL;
    }
}

10. Memory Alignment

#include <stdalign.h>

// Aligned allocation
void* aligned_malloc(size_t size, size_t alignment) {
    void* ptr = NULL;

    #ifdef _WIN32
        ptr = _aligned_malloc(size, alignment);
    #else
        if (posix_memalign(&ptr, alignment, size) != 0) {
            return NULL;
        }
    #endif

    return ptr;
}

void aligned_free(void* ptr) {
    #ifdef _WIN32
        _aligned_free(ptr);
    #else
        free(ptr);
    #endif
}

// Structure alignment
typedef struct {
    alignas(16) double values[4];  // 16-byte aligned
} AlignedData;

Best Practices

  1. Always check malloc return value - Handle allocation failures
  2. Free all allocated memory - Prevent memory leaks
  3. Set pointers to NULL after free - Avoid dangling pointers
  4. Use sizeof with types - Ensure correct allocation size
  5. Initialize allocated memory - Use calloc or memset
  6. Match malloc/free calls - Every allocation needs deallocation
  7. Use valgrind for testing - Detect memory errors
  8. Avoid manual pointer arithmetic - Use array indexing when possible
  9. Handle realloc failures - Keep original pointer valid
  10. Document ownership - Clarify who frees memory

Common Pitfalls

  1. Memory leaks - Forgetting to free allocated memory
  2. Double free - Freeing same pointer twice
  3. Use after free - Accessing freed memory
  4. Buffer overflow - Writing beyond allocated bounds
  5. Dangling pointers - Using pointers after free
  6. Null pointer dereference - Not checking for NULL
  7. sizeof mistakes - Using wrong size calculations
  8. Stack overflow - Large stack allocations
  9. Uninitialized memory - Reading uninitialized data
  10. Memory fragmentation - Poor allocation patterns

When to Use

  • Systems programming requiring manual control
  • Embedded systems with limited resources
  • Performance-critical applications
  • Operating system development
  • Device drivers and kernel modules
  • Real-time systems
  • Legacy codebase maintenance
  • Interfacing with hardware
  • Memory-constrained environments
  • Low-level library development

Resources

平台分布

OpenCode

30.02%
按下载量换算61

Codex

24.27%
按下载量换算50

Claude Code

18.69%
按下载量换算38

windsurf

13.48%
按下载量换算27

Antigravity

7.79%
按下载量换算16

Gemini CLI

3.92%
按下载量换算8

安全审计

Gen Agent Trust Hub

通过

Socket

通过

Snyk

通过

权限和风险

调用外部服务

该 Skill 可能调用第三方服务、云服务或外部模型 API,使用前需要确认账号、额度、数据发送范围和服务条款。

安装前确认

本站仅展示第三方公开信息,不托管安装包,不提供自动安装或运行环境。安装前应自行审查源码、依赖和命令行为。

继续浏览同类 Skills