使用 malloc后free出错 错误所在
2016-06-12 14:21
281 查看
偶认为:
这个问题是指针使用过程中很容易出错而且自己又很难发现的一个易疏忽问题-----------即:指针人为的更改了原来的指向地址。以下是一个很好的案例,其中红色字体为正确解。
问题:
用malloc与free出错,望指导,谢谢
程序很简单,用于测试他们的用法,因为在一个大点定程序中出错想找原因。
#include<stdlib.h>
void main()
{
char *test=malloc(100);
test="123";
free(test);
test=NULL;
}
问题补充:
test="123";
这样,test就指向了一个常量的地址,而不再是malloc()分配的空间地址,而free()只用于释放动态分配的空间,所以出错.
要想将"123"字符串放在test数组中,应该用strcpy()函数完成,或者对test数组的每个元素进行单独赋值.就是说要用memcpy或者strcpy将字符赋给test,而不能直接给test赋值
这样会改变地址。
回答2:
你的意思想是想把“123"放到刚用malloc函数开辟的空间中去,从结构来分析,”123“这个字符串并没有放你原先开辟的空间中去。另外,malloc和free一般是配合来使用的,你后来test这个指针指向的已不是malloc开辟的区域了。也就是楼上所说的,free智能只能释放动态内存。弄明白就行了。我也学习了。
malloc后free出错总结:
1、malloc与free配套使用。不要跨进程分配和释放;
2、指向malloc申请的堆内存的指针,在运用过程中千万不要另外赋值,否则同样导致内存泄露(我曾今翻过这样的错误)
3、malloc后,实际使用时指针长度超过了你申请的范围。再去free时肯定出问题。
4、改变指针的初始指向地址,如上文。
这个问题是指针使用过程中很容易出错而且自己又很难发现的一个易疏忽问题-----------即:指针人为的更改了原来的指向地址。以下是一个很好的案例,其中红色字体为正确解。
问题:
用malloc与free出错,望指导,谢谢
程序很简单,用于测试他们的用法,因为在一个大点定程序中出错想找原因。
#include<stdlib.h>
void main()
{
char *test=malloc(100);
test="123";
free(test);
test=NULL;
}
问题补充:
哦,大概明白了点,谢谢。 我用sprintf(test,"23123141421%s",test1);给char *test赋值,但是如果不char*test=malloc();就出错,用了也用free就出错,不free就不出错。。。 为什么呢,请问?学习C不久。。。问题有点无趣,但就是不明白,请指教 谢谢
回答1:
前面我接到了,free()只用于释放动态分配的空间,即malloc()/calloc()/realloc()函数分配的空间,否则不会成功.
test="123";
这样,test就指向了一个常量的地址,而不再是malloc()分配的空间地址,而free()只用于释放动态分配的空间,所以出错.
要想将"123"字符串放在test数组中,应该用strcpy()函数完成,或者对test数组的每个元素进行单独赋值.就是说要用memcpy或者strcpy将字符赋给test,而不能直接给test赋值
这样会改变地址。
回答2:
你的意思想是想把“123"放到刚用malloc函数开辟的空间中去,从结构来分析,”123“这个字符串并没有放你原先开辟的空间中去。另外,malloc和free一般是配合来使用的,你后来test这个指针指向的已不是malloc开辟的区域了。也就是楼上所说的,free智能只能释放动态内存。弄明白就行了。我也学习了。
malloc后free出错总结:
1、malloc与free配套使用。不要跨进程分配和释放;
2、指向malloc申请的堆内存的指针,在运用过程中千万不要另外赋值,否则同样导致内存泄露(我曾今翻过这样的错误)
3、malloc后,实际使用时指针长度超过了你申请的范围。再去free时肯定出问题。
4、改变指针的初始指向地址,如上文。
相关文章推荐
- GET和POST有什么区别?及为什么网上的多数答案都是错的。
- TAB切换简易代码,兼容IE9以上主流浏览器
- 无器械健身,是否真的比健身房器械训练要好?
- memcached安装
- ScroolView嵌套ListView
- Eclipse从本地压缩包安装插件
- JVM参数设置PermSize大于PermMaxSize,结果会怎么样?
- Android 蓝牙开发基本流程
- 获得手机sdCard
- spring security(六)
- IOS Dev Intro - Opengl ES Series 02
- ftl 取得list的长度
- Word2Vec学习笔记(二)
- 《笑话大全》APP代码详解4
- 转--Node.js学习系列总索引
- android自定义View绘制几何图形
- 8个Servlet Listener
- 亲!你见过这样表白的么
- [No00009B]win10快捷键大全
- 自动拍