From fd6f1af7a77b82aba6118737ba2b911b49b1331b Mon Sep 17 00:00:00 2001 From: rangersly <2281598291@qq.com> Date: Tue, 22 Apr 2025 18:15:27 +0800 Subject: [PATCH] ADD: c-cpp dynamic-memory.md --- program/c_cpp/universal/c_string.md | 39 +++++++++++++---- program/c_cpp/universal/dynamic-memory.md | 52 +++++++++++++++++++++++ 2 files changed, 82 insertions(+), 9 deletions(-) create mode 100644 program/c_cpp/universal/dynamic-memory.md diff --git a/program/c_cpp/universal/c_string.md b/program/c_cpp/universal/c_string.md index 53580c7..779317b 100644 --- a/program/c_cpp/universal/c_string.md +++ b/program/c_cpp/universal/c_string.md @@ -1,8 +1,18 @@ -# c风格字符串 - +# c风格字符串 `#include ` -```cpp +--- + +## INDEX + +- [字符串库函数](# std-string) +- [内存操作标准库函数](# std-mem) +- [与string容器转换](# to-string) + +--- + +## **std-string** +```c strcpy(buf1, "hello"); // 用后面的字符串覆盖前面的字符串 strncpy(buf1, "hello", 5); // 增加指定长度 @@ -16,15 +26,26 @@ strstr(buf1, "hello"); // 返回第一次出现子串的指针 strtok(buf1, " "); // 分割字符串,返回分割过的字符串 - - memset(buf1, 0, sizeof(buf1));//覆写内存块 - - memcpy(buf1, "hello", 5); //复制内存块 - - memmove(buf1 + 1, buf1, 4); //移动5个字节到前一个位置 ``` ___注:未进行长度指定的函数有溢出风险 例如:strcpy___ +--- + +## **std-mem** + +- 内存操作函数与str系的最大不同是不检测EOF +```c + memset(buf1, 0, sizeof(buf1));//覆写内存块 + + memcpy(buf1, "hello", 5); //复制内存块,不处理内存重叠 + + memmove(buf1 + 1, buf1, 4); //移动5个字节到前一个位置,可处理重叠 +``` +- `int memcmp(const void *ptr1, const void *ptr2, size_t num);` + - 比较函数,返回0表示相等 + +--- + ## 两种转换 ```cpp string str1; diff --git a/program/c_cpp/universal/dynamic-memory.md b/program/c_cpp/universal/dynamic-memory.md new file mode 100644 index 0000000..0b63443 --- /dev/null +++ b/program/c_cpp/universal/dynamic-memory.md @@ -0,0 +1,52 @@ +# 动态内存分配 + +--- + +## INDEX + +- [C](# C) + - [malloc](# malloc) + - [calloc](# calloc) + - [realloc](# realloc) + - [free](#) : 传入动态分配的指针地址,记得释放完赋NULL +- [CPP](# CPP) + - [new](# new) + - [delete](# delete) + +--- + +## C + +所有的函数声明于``头文件中 + +--- + +### **malloc** + +- 原型 `void *malloc(size_t size);` +- 功能 : 用于分配指定字节数的内存块 +- 特点 + - 分配的内存是未初始化的,内容随机 + - 返回指向分配内存起始地址的void指针 + - 如果分配失败,返回NULL + +--- + +### **calloc** + +- 原型 `void *calloc(size_t num, size_t size);` +- 特点 + - 比起 `malloc` 多了自动初始化 + +--- + +### **realloc** + +- 原型 `void *realloc(void *ptr, size_t new_size);` +- 功能 : 用于调整之前分配的内存块的大小 +- 特点 + - 可以扩大或缩小内存块 + - 新增部分不初始化 + - 如果ptr为NULL,等同于malloc + - 可能返回新的指针地址(内存块可能被移动到新位置) + - 如果`new_size`为0且ptr不为NULL,等同于free