C语言基础第18天:内存操作函数
内存操作
常用函数
内存填充
头文件:
#include <string.h>
void* memset(void* s, int c, size_t n);
函数功能:将内存块 s 的前 n 个字节填充为 c ,一般用于初始化或者清零操作。
参数说明:
s :目标内存首地址。
c :填充值(以 unsigned char 形式处理(0~255))。
n :填充字节数。
返回值:
成功:返回 s 的指针。
失败:返回NULL。
注意事项:
常用于动态初始化, c 通常设置为0(清零)。
按字节填充,非整型初始化需要谨慎(如填充 int 数组时,0是安全的)。
#include <stdio.h>
#include <stdlib.h>
#include <string.h>#define LEN 4int main(){// 在堆内存申请4个int的连续空间int *p = (int*)malloc(LEN * sizeof(int));// 非空校验if (!p){perror("内存申请失败!");return -1;}// 初始化堆内存空间,填充0,我们也可以称作清零操作memset(p, 0, LEN * sizeof(int));// 测试输出printf("%d,%d\n", p[1], *(p+1));// 释放内存free(p); // 等价于 realloc(p,0);// 对指针置空,防止空悬指针p = NULL;return 0;
}
内存拷贝
头文件:
#include <string.h>
函数原型:
源与目标内存无重叠时使用:
void* memcpy(void* dest, const void* src, size_t n);
安全处理内存重叠:
void* memmove(void* dest, const void* src, size_t n);
函数功能:将 src 的前 n 个字节拷贝到 dest。
参数说明:
dest :目标内存首地址,支持指针偏移。
src :源内存首地址,支持指针偏移。
size_t n :拷贝的字节数。
返回值:
成功:返回 dest 的首地址。
失败:返回NULL。
注意事项:
memmove 能正确处理内存重叠,推荐优先使用。
确保目标内存足够大,避免溢出。
#include <stdio.h>
#include <string.h>int main()
{// 准备两个数组,用来存储源和目标int src[4] = {11,22,33,44};// 拷贝 22,33 从src+1开始,拷贝2个 sizeof(int)int dest[6] = {111,222,333,444,555,666};// 目的地 dest+1,拷贝后:111,22,33,444,555,666register int i = 0;printf("拷贝前:");for (i = 0 ; i < 6 ; i++){printf("%-6d", dest[i]);}// 进行拷贝memmove(dest + 1, src + 1, 2 * sizeof(int));printf("\n拷贝后:");for (i = 0 ; i < 6 ; i++){printf("%-6d", dest[i]);}printf("\n");return 0;
}
内存比较
头文件:
#include <string.h>
函数原型:
int memcmp(const void* s1, const void* s2, size_t n);
函数功能:比较 s1 和 s2 的前 n 个字节。
返回值:
0 :内存内容相同。
> 0 : s1 中第一个不同字节大于 s2。
< 0 : s1 中第一个不同字节小于 s2。
注意事项:比较按字节进行,非字符串需确保长度一致(总字节数一致)。
#include <stdio.h>
#include <string.h>int main()
{// 准备两个测试用的数组int src[] = {111, 22, 33, 44};int dest[] = {111, 22, 10, 44, 555, 666};// 进行比较int result = memcmp(src, dest, 4 * sizeof(int));printf("%d 与 %d 的比较结果是 %d\n",*src, *dest, result);return 0;
}
内存查找
头文件:
#include <string.h>
函数原型:
正向查找,C语言标准库函数:
void* memchr(const void* s, int c, size_t n);
逆向查找,这个不是C语言标准库函数,属于GNU扩展:
void* memrchr(const void* s, int c, size_t n);
函数功能:在 s 的前 n 个字节中查找字符 c。
返回值:
成功:返回找到内容对应的地址
失败:返回NULL
注意事项:
memrchr 是GNU扩展函数,需手动声明(只要不是C语言标准提供,编译的时候都需要手动声明或链接)。
查找单位为字节值,非整型数据需要注意内存布局。
#include <stdio.h>
#include <string.h>int main(int argc, char *argv[])
{// 准备一个测试数组char str[] = {'A','B','C','B'};// 查找字符 Bchar* first = (char*)memchr(str, 'B', sizeof(str)); // 返回 低地址对应的字符地址char* last = (char*)memrchr(str, 'B', sizeof(str)); // GNU扩展函数,返回 高地址对应的字符地址printf("first = %p,last = %p\n", first, last);//first = 0x7fff65a47875,last = 0x7fff65a47877printf("第 1 个 B 的位置:%ld\n", first - str);// 1printf("最后 1 个 B 的位置:%ld\n", last - str);// 3return 0;
}