C语言内存函数全解析

内存函数概述

C语言中的内存函数主要用于动态内存管理,包括分配、释放、复制和初始化内存区域。这些函数位于<stdlib.h><string.h>头文件中,是高效处理数据结构的核心工具。

动态内存分配与释放

malloc函数用于分配指定字节数的未初始化内存块,返回指向内存起始地址的指针。若分配失败,返回NULL

int *arr = (int*)malloc(10 * sizeof(int)); // 分配10个整型空间  

callocmalloc类似,但会将分配的内存初始化为零,参数为元素数量和每个元素的大小。

int *arr = (int*)calloc(10, sizeof(int)); // 分配并初始化为0  

realloc调整已分配内存块的大小,可扩展或缩小。若新大小为零,其行为等同于free

arr = (int*)realloc(arr, 20 * sizeof(int)); // 扩展至20个整型  

free释放动态分配的内存,防止内存泄漏。释放后应避免继续使用该指针(可设为NULL)。

free(arr);  
arr = NULL;  

内存操作函数

memcpy从源地址复制指定字节数到目标地址,不处理内存重叠问题。

char src[] = "Hello";  
char dest[10];  
memcpy(dest, src, strlen(src) + 1); // 复制包括'\0'  

memmove功能类似memcpy,但能正确处理内存重叠区域。

char str[] = "memmove";  
memmove(str + 3, str, 4); // 重叠复制后结果为"memmemve"  

memset将内存块的每个字节设为指定值,常用于初始化或清零。

char buffer[100];  
memset(buffer, 0, 100); // 全部字节置零  

memcmp比较两内存区域的前N个字节,返回值为零表示相等。

int cmp = memcmp(arr1, arr2, 10 * sizeof(int)); // 比较10个整型  

内存操作的安全实践

动态内存分配后必须检查返回值是否为NULL,避免解引用空指针。

if (arr == NULL) {  
    fprintf(stderr, "Memory allocation failed");  
    exit(EXIT_FAILURE);  
}  

使用memset清零敏感数据(如密码)可减少信息泄露风险。释放内存后应立即将指针置NULL,防止悬垂指针。

避免内存泄漏需确保每次malloccalloc都有对应的free。内存操作函数需确保目标缓冲区足够大,防止缓冲区溢出。

性能优化技巧

频繁分配小块内存时,可预分配大块内存并手动管理,减少malloc调用开销。realloc可能导致数据拷贝,预估初始大小以减少调整次数。

memcpy比逐字节复制更快,但需注意编译器可能对其优化(如使用SIMD指令)。内存操作函数的性能与内存对齐相关,确保数据按自然边界对齐可提升速度。

调试与错误排查

内存错误可通过工具如Valgrind或AddressSanitizer检测。常见问题包括:

  • 越界访问(写入超出分配范围)
  • 重复释放同一内存块
  • 访问已释放的内存

调试时可用宏记录分配和释放的调用位置:

#define SAFE_MALLOC(size) my_malloc(size, __FILE__, __LINE__)  
void* my_malloc(size_t size, const char* file, int line) {  
    void *p = malloc(size);  
    printf("Allocated %zu bytes at %s:%d\n", size, file, line);  
    return p;  
}  

BbS.okapop031.sbs/PoSt/1122_888281.HtM
BbS.okapop032.sbs/PoSt/1122_710420.HtM
BbS.okapop033.sbs/PoSt/1122_322845.HtM
BbS.okapop034.sbs/PoSt/1122_741803.HtM
BbS.okapop035.sbs/PoSt/1122_855975.HtM
BbS.okapop036.sbs/PoSt/1122_583822.HtM
BbS.okapop037.sbs/PoSt/1122_750656.HtM
BbS.okapop038.sbs/PoSt/1122_842333.HtM
BbS.okapop039.sbs/PoSt/1122_120023.HtM
BbS.okapop040.sbs/PoSt/1122_720325.HtM
BbS.okapop031.sbs/PoSt/1122_053618.HtM
BbS.okapop032.sbs/PoSt/1122_692788.HtM
BbS.okapop033.sbs/PoSt/1122_667377.HtM
BbS.okapop034.sbs/PoSt/1122_008232.HtM
BbS.okapop035.sbs/PoSt/1122_453946.HtM
BbS.okapop036.sbs/PoSt/1122_425701.HtM
BbS.okapop037.sbs/PoSt/1122_179204.HtM
BbS.okapop038.sbs/PoSt/1122_601143.HtM
BbS.okapop039.sbs/PoSt/1122_215500.HtM
BbS.okapop040.sbs/PoSt/1122_258976.HtM
BbS.okapop031.sbs/PoSt/1122_589247.HtM
BbS.okapop032.sbs/PoSt/1122_617043.HtM
BbS.okapop033.sbs/PoSt/1122_304472.HtM
BbS.okapop034.sbs/PoSt/1122_460694.HtM
BbS.okapop035.sbs/PoSt/1122_068990.HtM
BbS.okapop036.sbs/PoSt/1122_544819.HtM
BbS.okapop037.sbs/PoSt/1122_069274.HtM
BbS.okapop038.sbs/PoSt/1122_139641.HtM
BbS.okapop039.sbs/PoSt/1122_949545.HtM
BbS.okapop040.sbs/PoSt/1122_087770.HtM
BbS.okapop031.sbs/PoSt/1122_014322.HtM
BbS.okapop032.sbs/PoSt/1122_306076.HtM
BbS.okapop033.sbs/PoSt/1122_308278.HtM
BbS.okapop034.sbs/PoSt/1122_173623.HtM
BbS.okapop035.sbs/PoSt/1122_196399.HtM
BbS.okapop036.sbs/PoSt/1122_049310.HtM
BbS.okapop037.sbs/PoSt/1122_565984.HtM
BbS.okapop038.sbs/PoSt/1122_505592.HtM
BbS.okapop039.sbs/PoSt/1122_962330.HtM
BbS.okapop040.sbs/PoSt/1122_741013.HtM
BbS.okapop031.sbs/PoSt/1122_274197.HtM
BbS.okapop032.sbs/PoSt/1122_273995.HtM
BbS.okapop033.sbs/PoSt/1122_833208.HtM
BbS.okapop034.sbs/PoSt/1122_642997.HtM
BbS.okapop035.sbs/PoSt/1122_657903.HtM
BbS.okapop036.sbs/PoSt/1122_882959.HtM
BbS.okapop037.sbs/PoSt/1122_049536.HtM
BbS.okapop038.sbs/PoSt/1122_526038.HtM
BbS.okapop039.sbs/PoSt/1122_051740.HtM
BbS.okapop040.sbs/PoSt/1122_378950.HtM
BbS.okapop031.sbs/PoSt/1122_298822.HtM
BbS.okapop032.sbs/PoSt/1122_400412.HtM
BbS.okapop033.sbs/PoSt/1122_772770.HtM
BbS.okapop034.sbs/PoSt/1122_009113.HtM
BbS.okapop035.sbs/PoSt/1122_961572.HtM
BbS.okapop036.sbs/PoSt/1122_533551.HtM
BbS.okapop037.sbs/PoSt/1122_353766.HtM
BbS.okapop038.sbs/PoSt/1122_969956.HtM
BbS.okapop039.sbs/PoSt/1122_736039.HtM
BbS.okapop040.sbs/PoSt/1122_592615.HtM
BbS.okapop031.sbs/PoSt/1122_796618.HtM
BbS.okapop032.sbs/PoSt/1122_051636.HtM
BbS.okapop033.sbs/PoSt/1122_450244.HtM
BbS.okapop034.sbs/PoSt/1122_844861.HtM
BbS.okapop035.sbs/PoSt/1122_366154.HtM
BbS.okapop036.sbs/PoSt/1122_689733.HtM
BbS.okapop037.sbs/PoSt/1122_632828.HtM
BbS.okapop038.sbs/PoSt/1122_390800.HtM
BbS.okapop039.sbs/PoSt/1122_590570.HtM
BbS.okapop040.sbs/PoSt/1122_966343.HtM
BbS.okapop031.sbs/PoSt/1122_901160.HtM
BbS.okapop032.sbs/PoSt/1122_417352.HtM
BbS.okapop033.sbs/PoSt/1122_677662.HtM
BbS.okapop034.sbs/PoSt/1122_052240.HtM
BbS.okapop035.sbs/PoSt/1122_043791.HtM
BbS.okapop036.sbs/PoSt/1122_998708.HtM
BbS.okapop037.sbs/PoSt/1122_029213.HtM
BbS.okapop038.sbs/PoSt/1122_808407.HtM
BbS.okapop039.sbs/PoSt/1122_307876.HtM
BbS.okapop040.sbs/PoSt/1122_252937.HtM

#牛客AI配图神器#

全部评论

相关推荐

11月了,甚至没有一个流程中的😅不知道是不是北森没认真写还是笔试a太少了,九月投到现在甚至只有两个面试。虎牙一面挂得不明不白,字节二面挂,现在看起来滴滴转正也是没戏了的。广东人不想离开广东,想着广州深圳这么大怎么着也能找个养活自己,但是实际情况是,腾讯暑期到现在就没被捞过一次,广东这边字节投了也没反应。中小厂也基本没反应,零一空间面完让我写笔试题,也挂的不明不白,感觉回答也七七八八,笔试也基本写。现在是看着周围的人上岸中大厂,每一天压力是真的大,高考确实我也尽力了,遇上22年广东高考数学爆炸直接平时还能看得上眼的也没了。为了弥补学历差距,我也觉得我努力了,大二暑假开始实习,从小厂到中厂到大厂,我也努力拼了。回想起滴滴刚oc时候的觉得一切都好起来了,怀着激动的心独自坐上前往北京的飞机,原来也只是昙花一现,来这里才发现是误闯天家,确实也学到了很多,但是也明白确实cover不了正职的活,可能真是学习能力不比了92,写文档和组织代码能力还在被mt喷中😭有时候真在想是不是没有这一年的实习,在学校混混日子,毕业了跑滴滴送外卖也心安理得,但是卷过了,是真不甘心了。好在十月和ld申请转base回到了广州继续实习,很难想象在北京我现在会是什么状态。要不是房租还在交着,真想辞了回家睡几天,虽然也没啥颜面回去面对家人的期望。现在还有两个据说有转正hc的实习生面试,虽然也可能是画大饼,但是属于是转正也比不上同学提前实习工资那种。未来会好起来吗?不知道。春招会好起来吗?我觉得难说。想起之前自信得说我一定能找到满意的工作,很想笑了。现在想起来,日常实习的时候真的是最幸福的时光,没有压力,学得到东西,自己赚钱花也心安理得。
无面如何呢:会赢的
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务