c-free()方法
方法 free
2023-06-13 09:15:29 时间
浏览量 1
Q:以下代码,当用户输入’freeze’时会崩溃,而如果输入’zebra’则运行正常,为什么?
#include <stdio.h>
#include <stdlib.h>
#include <memory.h>
int main(int argc, char *argv[])
{
//分配内存空间
char *ptr = (char *)malloc(10);
if (NULL == ptr){
return -1;
}
if (argc == 1){
printf("\n Usage: add a string \n");
}else {
//初始化,将已开辟内存空间 ptr 的首 n(这里n=10)个字节的值设为值 0
memset(ptr, 0, 10);
strncpy(ptr, argv[1], 9);
while (*ptr != 'z'){
if (*ptr == ' ') break;
else ptr++;
}
if (*ptr == 'z'){
printf("\n String contains 'z' \n");
//Do some more processing
}
//释放内存空间
free(ptr);
}
return 0;
}
A:问题的根源是因为代码在while循环中改变了 ptr 指针的地址。当输入为’zebra’时,while循环甚至在执行第一遍前就结束了,所以free()释放的内存地址就是一开始malloc()分配的地址。但是当输入’freeze’时, ptr记录的地址在while循环中被更改,因此将会使错误的地址传递到free()方法中引起崩溃。 注意:调用free()方法释放内存时,参数必须要么是NULL,要么是先前从malloc/calloc或者realloc返回的地址,不能将一次动态申请的内存的部分释放。
相关文章
- YOLOv5抛弃Anchor-Base方法 | YOLOv5u正式加入Anchor-Free大家庭
- 基于ORA-19815闪回空间爆满问题的处理方法
- linux 查看机器内存方法 (free命令)详解程序员
- Oracle 等待事件 flashback buf free by RVWR 官方解释,作用,如何使用及优化方法
- Oracle 等待事件 free global transaction table entry 官方解释,作用,如何使用及优化方法
- Free命令在Linux系统中的作用(linux下free命令)
- jar运行方法详解编程语言
- Linux文件写入教程:简单易懂的文件写入方法(linux将文件写入文件)
- Linux下查询已安装软件的方法(linux查询安装的软件)
- 类型Oracle数据库中的CHAR类型及其使用方法(oracle中char)
- Redis读取二进制数据的实现方法(redis读二进制)
- sql2000挂起无法安装的问题的解决方法
- JSOOP包机制,类创建的方法定义
- linux下为php添加curl扩展的方法
- iis7中session丢失的解决方法小结