目录
1.2. calloc(size_t num, size_t size)
1.3. realloc(void *ptr, size_t size)
在C语言中,内存操作是编程中非常基础且重要的一部分。C标准库提供了一系列用于内存操作的函数,这些函数允许程序员直接对内存进行读写、复制、分配和释放等操作。以下是一些常用的内存操作函数的大全:
一、 动态内存分配
1.1.malloc(size_t size)
- 分配一块指定大小的内存区域,并返回一个指向该区域的指针。
- 如果分配失败,则返回NULL。
- 详细讲解见:动态内存分配之一:malloc()函数详解_malloc 使用库-CSDN博客
1.2. calloc(size_t num, size_t size)
- 分配一块足够大的内存以存储
num
个size
大小的元素,并将所有位初始化为0。 - 返回一个指向分配的内存的指针,如果分配失败,则返回NULL。
- 相比于
malloc
,calloc
会进行内存初始化,因此在某些情况下可能会稍慢。 - 详细讲解见:动态内存分配之二:calloc()函数详解-CSDN博客
1.3. realloc(void *ptr, size_t size)
- 尝试改变之前通过
malloc
、calloc
或realloc
分配的内存块的大小。 - 如果
ptr
是NULL,则realloc
的行为与malloc
相同。 - 如果
size
是0,并且ptr
不是NULL,则释放ptr
指向的内存块,并返回NULL。 - 如果成功,返回指向新内存块的指针(可能与原指针相同),如果失败,则返回NULL。
- 详细讲解见:动态内存分配之三:realloc()函数详解-CSDN博客
1.4. free(void *ptr)
- 释放之前通过
malloc
、calloc
或realloc
分配的内存块。 - 如果
ptr
是NULL,则不执行任何操作。 - 释放内存后,应将指针设置为NULL,以避免野指针问题。
- 详细讲解:动态内存分配之四:free()函数详解-CSDN博客
二、内存内容操作
2.1. memcmp()
- 功能:比较两个内存块的内容。
- 原型:
int memcmp(const void *s1, const void *s2, size_t n);
- 参数:
s1
:指向要比较的第一个内存块的指针。s2
:指向要比较的第二个内存块的指针。n
:要比较的字节数。
- 返回值:
- 如果
s1
小于s2
,则返回负值。 - 如果
s1
等于s2
,则返回0。 - 如果
s1
大于s2
,则返回正值。
- 如果
- 用途:用于检查两个内存块是否相等,或者一个内存块是否小于或大于另一个。
其详细讲解和介绍见内存内容操作之一:memcmp函数详解-CSDN博客
2.2. memcpy()
- 功能:从源内存地址复制n个字节的数据到目标内存地址。
- 原型:
void *memcpy(void *dest, const void *src, size_t n);
- 参数:
dest
:目标内存地址,即要将数据复制到的位置。src
:源内存地址,即要复制数据的起始位置。n
:要复制的字节数。
- 返回值:返回目标内存地址
dest
的指针。 - 注意:源内存块和目标内存块不能重叠。
其详细讲解和介绍见内存内容操作之二:memcpy函数详解-CSDN博客
2.3. memmove()
- 功能:与
memcpy()
类似,但更安全,可以处理源内存块和目标内存块重叠的情况。 - 原型:
void *memmove(void *dest, const void *src, size_t n);
- 参数:与
memcpy()
相同。 - 返回值:返回目标内存地址
dest
的指针。 - 注意:通过智能地调整复制方向(向前或向后),确保在内存块重叠时也能正确复制数据。
其详细讲解和介绍见:内存内容操作之三:memmove函数详解-CSDN博客
2.4. memset()
- 功能:将目标内存块的前n个字节设置为指定的值。
- 原型:
void *memset(void *s, int c, size_t n);
- 参数:
s
:指向要设置的内存块的指针。c
:要设置的值(通常是一个字节的值,会被转换为unsigned char
)。n
:要设置的字节数。
- 返回值:返回目标内存地址
s
的指针。 - 用途:常用于初始化内存块、清除内存等操作。
其详细讲解和介绍见:内存内容操作之四:memset函数详解-CSDN博客
2.5. memchr()
- 功能:在内存块中搜索首次出现的指定字符。
- 原型:
void *memchr(const void *s, int c, size_t n);
- 参数:
s
:指向要被搜索的内存块的指针。c
:要搜索的字符(实际传递的是其ASCII值)。n
:要搜索的字节数。
- 返回值:如果找到指定字符,则返回指向该字符的指针;否则返回
NULL
。
其详细介绍和讲解见:内存内容操作之五:memchr 函数详解-CSDN博客
三、字符串操作(涉及内存)
由于C语言本身不直接支持字符串类型,字符串通常是通过字符数组的形式来存储和处理的,并以空字符('\0')作为结束标志。以下是一些常用的C语言中涉及内存的字符串操作函数:
3.1. 字符串长度计算
- strlen():计算字符串的长度,即字符串中字符的数量,不包括字符串结尾的空字符('\0')。函数定义在
<string.h>
头文件中。 - 其详细讲解和介绍见:字符串长度计算函数strlen()详解-CSDN博客
3.2. 字符串复制
- strcpy():将一个字符串复制到另一个字符串数组中,包括字符串结尾的空字符('\0')。这个函数也需要确保目标字符串数组有足够的空间来存储源字符串,否则可能会导致缓冲区溢出。
- strncpy():与strcpy()类似,但它允许指定复制的最大字符数,这有助于防止缓冲区溢出。
- 其详细讲解和介绍见:字符串复制函数strcpy()和strncpy()详解-CSDN博客
3.3. 字符串连接
- strcat():将两个字符串连接起来,即将源字符串追加到目标字符串的末尾,包括字符串结尾的空字符('\0')。同样,这个函数也需要确保目标字符串数组有足够的空间来存储两个字符串连接后的结果。
- strncat():与strcat()类似,但允许指定追加的最大字符数。
- 其详细讲解和介绍见:字符串连接函数strcat()和strncat()详解-CSDN博客
3.4. 字符串比较
- strcmp():比较两个字符串是否相等。它按照字典顺序比较字符串中的字符,直到遇到不同的字符或遇到字符串的结尾。
- strncmp():与strcmp()类似,但只比较字符串的前n个字符。
- 其详细讲解和介绍见:字符串比较函数strcmp()和strncmp()详解-CSDN博客
3.5. 字符串查找
- strchr():在一个字符串中查找指定字符的第一个匹配位置。
- strrchr():在一个字符串中查找指定字符的最后一个匹配位置。
- strstr():在一个字符串中查找指定子字符串的第一个匹配位置。
- 其详细讲解和介绍见:字符串查找函数strchr 、 strrchr和strstr的简介-CSDN博客
3.6. 字符串分割
- strtok():将一个字符串分割成多个子字符串。这个函数可以连续调用,每次调用都会返回下一个分割后的子字符串。
- 字符串分割函数strtok()详解-CSDN博客
3.7. 字符串与数值的转换
字符串与数值之间的转换主要通过标准库函数实现。这些函数定义在<stdlib.h>
(对于整数和浮点数转换)和<stdio.h>
(对于字符串的格式化输入输出,间接用于转换)中。下面是一些常用的字符串与数值转换函数。
1. 字符串转整数
- atoi():将字符串转换为整型数(
int
)。这个函数没有错误检查,如果转换失败,它会返回0。 - atol():将字符串转换为长整型数(
long
)。与atoi()
类似,也没有错误检查。 - strtol():将字符串转换为长整型数(
long
),并提供了错误检查机制。 - strtoimax():将字符串转换为最大宽度的整数类型(
intmax_t
),提供了更广泛的整数范围和错误检查。
2. 字符串转浮点数
- atof():将字符串转换为双精度浮点数(
double
)。这个函数没有错误检查,如果转换失败,它会返回0.0。 - strtod():将字符串转换为双精度浮点数(
double
),并提供了错误检查机制。 - strtof():将字符串转换为单精度浮点数(
float
),并提供了错误检查机制。 - strtold():将字符串转换为扩展精度的浮点数(
long double
),并提供了错误检查机制。
3. 整数转字符串
- sprintf():虽然
sprintf()
主要用于格式化输出到字符串,但它也可以用来将整数转换为字符串。通过指定格式说明符(如%d
、%ld
、%lld
等),可以将整数转换为字符串。 - snprintf():与
sprintf()
类似,但允许你指定目标字符串的大小,从而避免缓冲区溢出。 - itoa():这不是C标准库的一部分,但在某些环境中可用,用于将整数转换为字符串。由于不是标准函数,其可用性和行为可能因编译器而异。
- 整数转字符串itoa()详解-CSDN博客
- 字符串格式化函数sprintf和snprintf的详解-CSDN博客
4. 浮点数转字符串
- sprintf() 和 snprintf():同样,这些函数也可以用于将浮点数转换为字符串,通过指定格式说明符(如
%f
、%e
、%g
等)。
5. 注意
- 使用
strtol()
、strtod()
等函数时,应检查函数的返回值以及可能设置的errno
值(如果可用),以检测转换错误。 - 字符串到数值的转换函数(如
atoi()
、atof()
)在转换失败时可能不会给出明确的错误指示,因此在使用时需要格外小心。 - 数值到字符串的转换通常通过格式化输出函数(如
sprintf()
)实现,这些函数提供了丰富的格式化选项。
3.8. 字符串格式化
- sprintf():格式化输出并将结果存储到一个字符串中。这个函数可以生成格式化的字符串,类似于printf(),但结果不是输出到标准输出,而是存储到指定的字符串中。
3.9. 注意事项
- 在使用上述函数时,需要包含相应的头文件,如
<string.h>
和<stdlib.h>
。 - 字符串操作函数在处理字符串时,通常不会检查目标数组的大小,因此程序员需要确保目标数组有足够的空间来存储结果,以避免缓冲区溢出。
- 对于动态分配的字符串,使用完毕后需要手动释放内存,以避免内存泄漏。
这些函数是C语言标准库中处理内存时最常用的函数。在使用这些函数时,务必注意内存泄漏、缓冲区溢出等安全问题。