C语言中的内存函数主要用于动态分配内存、释放内存和对内存内容进行操作。这些函数都在标准库 <stdlib.h>
和 <string.h>
中定义。以下是 C 语言常用的内存函数及其详细说明:
1. 动态内存管理函数
这些函数位于 <stdlib.h>
中,用于在运行时分配和释放内存。
1.1 malloc
示例:
功能:分配一块指定大小的内存,返回指向内存块起始地址的指针。
语法:c复制代码void* malloc(size_t size);
参数:
size
: 要分配的字节数。
返回值:
成功:返回内存块的首地址。
失败:返回 NULL
。
注意:
内存中的初始值未初始化(随机值)。
示例:
int* ptr = (int*)malloc(10 * sizeof(int)); // 分配 10 个整数大小的内存
if (ptr == NULL) {
printf("内存分配失败\n");
}
1.2 calloc
- 功能:分配一块内存并初始化为 0。
- 语法:
void* calloc(size_t num, size_t size);
参数:
num
: 元素数量。size
: 每个元素的大小。
返回值:
- 成功:返回内存块的首地址。
- 失败:返回
NULL
。
注意:
- 分配的内存会自动初始化为 0。
示例:
int* ptr = (int*)calloc(10, sizeof(int)); // 分配并初始化 10 个整数
if (ptr == NULL) {
printf("内存分配失败\n");
}
1.3 realloc
- 功能:调整已分配内存块的大小。
- 语法:
void* realloc(void* ptr, size_t new_size);
参数:
ptr
: 指向已分配内存的指针。new_size
: 新的内存块大小。
返回值:
- 成功:返回新内存块的指针。
- 失败:返回
NULL
,原内存不变。
注意:
- 如果扩展内存成功,原数据会被保留。
- 如果缩小内存,可能会丢失超出新大小的数据。
示例:
int* ptr = (int*)malloc(5 * sizeof(int));
ptr = (int*)realloc(ptr, 10 * sizeof(int)); // 扩展内存到 10 个整数
1.4 free
- 功能:释放由
malloc
、calloc
或realloc
分配的内存。 - 语法:c复制代码
void free(void* ptr);
参数:
ptr
: 指向已分配内存的指针。
注意:
- 释放后,指针不再指向有效内存,需要将指针置为
NULL
避免悬空指针问题。
示例:
free(ptr);
ptr = NULL; // 避免悬空指针
2. 内存操作函数
这些函数位于 <string.h>
中,用于操作内存块。
2.1 memset
- 功能:将指定值填充到一段内存中。
- 语法:c复制代码
void* memset(void* ptr, int value, size_t num);
参数:
ptr
: 指向内存块的指针。value
: 要填充的值(以字节为单位)。num
: 要填充的字节数。
返回值:返回指向内存块的指针。示例:
int arr[10];
memset(arr, 0, sizeof(arr)); // 将数组全部初始化为 0
2.2 memcpy
- 功能:将一块内存复制到另一块内存。
- 语法:c复制代码
void* memcpy(void* dest, const void* src, size_t num);
参数:
dest
: 目标内存地址。src
: 源内存地址。num
: 要复制的字节数。
返回值:返回目标内存地址。注意:
- 源地址和目标地址不能重叠。
示例:
char src[] = "Hello";
char dest[10];
memcpy(dest, src, strlen(src) + 1); // 复制字符串
2.3 memmove
- 功能:将一块内存复制到另一块内存,支持重叠区域。
- 语法:c复制代码
void* memmove(void* dest, const void* src, size_t num);
参数:
dest
: 目标内存地址。src
: 源内存地址。num
: 要复制的字节数。
返回值:返回目标内存地址。注意:
- 比
memcpy
安全,但速度稍慢。
示例:
char str[] = "HelloWorld";
memmove(str + 5, str, 5); // 将前 5 个字符移动到后面
2.4 memcmp
- 功能:比较两块内存的内容。
- 语法:
int memcmp(const void* ptr1, const void* ptr2, size_t num);
参数:
ptr1
: 第一块内存的地址。ptr2
: 第二块内存的地址。num
: 比较的字节数。
返回值:
- 0:内存内容相同。
- 0:
ptr1
内容大于ptr2
。 - <0:
ptr1
内容小于ptr2
。
示例:
char a[] = "Hello";
char b[] = "World";
int result = memcmp(a, b, 5); // 比较前 5 个字节
2.5 strlen
- 功能:获取字符串长度(不包括空字符
\0
)。 - 语法:
size_t strlen(const char* str);
参数:
str
: 字符串指针。
返回值:字符串长度。示例:
char str[] = "Hello";
size_t len = strlen(str); // 返回 5
3. 注意事项
- 动态内存分配时,必须确保释放以防止内存泄漏。
- 对未初始化或释放后的内存操作会导致未定义行为。
- 在
memcpy
和memmove
操作中,需确保内存块的大小和地址合法,避免越界。 - 调试工具(如
valgrind
)可以帮助检测内存泄漏或越界问题。
总结
这些内存管理和操作函数是 C 语言中处理动态内存和高效操作的核心工具。正确理解并熟练使用这些函数,是编写健壮、高效程序的关键。
发布者:myrgd,转载请注明出处:https://www.object-c.cn/4390