• malloc后 free出错原因都有哪些?
  • 发布于 2个月前
  • 179 热度
    0 评论
  • 黄月英
  • 0 粉丝 48 篇博客
  •   
引言
这个问题是指针使用过程中很容易出错而且自己又很难发现的一个易疏忽问题 ———–即:指针人为的更改了原来的指向地址。以下是一个很好的案例,其中红色字体为正确解。

问题: 用 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 就不出错。这是为什么呢?

free () 只用于释放动态分配的空间,即 malloc ()/calloc ()/realloc () 函数分配的空间,否则不会成功.
test=”123”;
这样,test 就指向了一个常量的地址,而不再是 malloc () 分配的空间地址,而 free () 只用于释放动态分配的空间,所以出错。要想将”123” 字符串放在 test 数组中,应该用 strcpy () 函数完成,或者对 test 数组的每个元素进行单独赋值。就是说要用 memcpy 或者 strcpy 将字符赋给 test,而不能直接给 test 赋值 这样会改变地址。

看起来是把 “123” 放到刚用 malloc 函数开辟的空间中去,但是从结构来分析,”123“这个字符串并没有放你原先开辟的空间中去。另外,malloc 和 free 一般是配合来使用的,你后来 test 这个指针指向的已不是 malloc 开辟的区域了。也就是上面所说的,free 智能只能释放动态内存。

malloc 后 free 出错总结:
1、malloc 与 free 配套使用。不要跨进程分配和释放;
2、指向 malloc 申请的堆内存的指针,在运用过程中千万不要另外赋值,否则同样导致内存泄露(我曾今翻过这样的错误)
3、malloc 后,实际使用时指针长度超过了你申请的范围。再去 free 时肯定出问题。
4、改变指针的初始指向地址,如上文。
用户评论