浏览代码

feat: 内存管理功能

添加了mem.c文件
mem.c文件包含free、calloc、realloc、strcpy,等多个内存和字符串函数的API封装
mem.h文件包含了内存管理功能的宏和函数声明
SongZihuan 4 年之前
父节点
当前提交
a7623d7c22
共有 4 个文件被更改,包括 89 次插入0 次删除
  1. 7 0
      CMakeLists.txt
  2. 13 0
      include/mem.h
  3. 6 0
      main.c
  4. 63 0
      memory/mem.c

+ 7 - 0
CMakeLists.txt

@@ -0,0 +1,7 @@
+CMAKE_MINIMUM_REQUIRED(VERSION 3.16)
+PROJECT(VirtualMath C)
+SET(CMAKE_C_STANDARD 11)
+
+INCLUDE_DIRECTORIES(${PROJECT_SOURCE_DIR}/include)
+AUX_SOURCE_DIRECTORY(memory PASER_LIST)
+ADD_EXECUTABLE(VirtualMath main.c ${PASER_LIST})

+ 13 - 0
include/mem.h

@@ -0,0 +1,13 @@
+#ifndef VIRTUALMATH_MEM_H
+#define VIRTUALMATH_MEM_H
+#include <string.h>
+
+void *memFreeCore(void *p);
+void *memCalloc(size_t num, size_t size);
+void *memRealloc(void *old, size_t size);
+char *memStrcpy(size_t nsize, int free_old, char *str, int write, ...);
+char *memString(size_t size);
+size_t memStrlen(char *p);
+#define memFree(p) p=memFreeCore(p)
+
+#endif //VIRTUALMATH_MEM_H

+ 6 - 0
main.c

@@ -0,0 +1,6 @@
+#include <stdio.h>
+
+int main() {
+    printf("Hello, World!\n");
+    return 0;
+}

+ 63 - 0
memory/mem.c

@@ -0,0 +1,63 @@
+#include <string.h>
+#include <stdlib.h>
+#include <stdio.h>
+#include "mem.h"
+
+void *memFreeCore(void *p){
+    if (p != NULL)
+        free(p);
+    return NULL;
+}
+
+void *memCalloc(size_t num, size_t size){
+    if (num == 0 || size == 0)
+        return NULL;
+    void *tmp = calloc(num, size);
+    return tmp;
+}
+
+void *memRealloc(void *old, size_t size){
+    if (size == 0)
+        return NULL;
+    void *tmp;
+    if (old == NULL)
+        tmp = memCalloc(1,size);
+    else
+        tmp = realloc(old, size);
+    return tmp;
+}
+
+size_t memStrlen(char *p){  // 可以读取NULL的strlen
+    if (p == NULL){
+        return 0;
+    }
+    else{
+        return strlen(p);
+    }
+}
+
+char *memString(size_t size) {  // 比memCalloc多了一个设置\0的步骤
+    char *tmp = (char *)memCalloc(size + 1, sizeof(char));
+    tmp[size] = '\0';
+    return tmp;
+}
+
+char *memStrcpy(size_t nsize, int free_old, char *str, int write, ...) {  // 复制str到新的空间,nszie是要扩展的大小。该函数支持让str=NULL,则变为单纯的memString
+    char *tmp = memString(memStrlen(str) + nsize + 1);
+    if (str != NULL){
+        strcpy(tmp, str);
+        tmp[memStrlen(str)] = (char)0;  // 去除多余的\0
+        if (free_old){
+            memFree(str);
+        }
+    }
+    if (write){
+        va_list argp;
+        va_start(argp, write);
+        for (int i = 0; i < nsize; i++){
+            tmp[memStrlen(str) + i] = (char)va_arg(argp, int);
+        }
+        va_end(argp);
+    }
+    return tmp;
+}