您的位置:首页 > 其它

使用 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;

}

问题补充:

哦,大概明白了点,谢谢。
我用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、改变指针的初始指向地址,如上文。




                                            
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: