偶认为: 这个问题是指针使用过程当中很容易出错并且本身又很难发现的一个易疏忽问题———–即:指针人为的更改了原来的指向地址。如下是一个很好的案例,其中红色字体为正确解。 问题: 用malloc与free出错,望指导,谢谢 程序很简单,用于测试他们的用法,由于在一个大点定程序中出错想找缘由。数组
#include<stdlib.h> void main() { char *test=malloc(100); test="123"; free(test); test=NULL; }
问题补充: 哦,大概明白了点,谢谢。 我用sprintf(test,”23123141421%s”,test1);给char test赋值,可是若是不chartest=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出错总结:指针
一、malloc与free配套使用。不要跨进程分配和释放; 二、指向malloc申请的堆内存的指针,在运用过程当中千万不要另外赋值,不然一样致使内存泄露(我曾今翻过这样的错误) 三、malloc后,实际使用时指针长度超过了你申请的范围。再去free时确定出问题。 四、改变指针的初始指向地址,如上文。code