malloc与free要配对使用,但是若对指针的相关操作不注意,同样会导致错误。
首先来看下面的一个小例子:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int main()
{
char *c = (char *)malloc(sizeof(char)*5);
bzero(c, 5);
printf("--%x\n", c);
char c2[] = "abcd";
c = c2;
printf("--%x\n", c);
printf("--%x\n", c2);
free(c);
c = NULL;
return 0;
}
例子很简单,先malloc一块内存,然后赋值,最后再free。但运行就出错
产生了段错误。
再来看打印出的地址信息,地址被更改了。
原来是通过 c=c2 操作,c指向了c2所指向的内存。指向地址发生了改变。而这时,地址0x32745a50由c和c2共同指向。free(c)会释放掉所share的内存,导致出错。
由于不是拷贝,导致指针指向发生改变。
若对代码进行如下修改
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int main()
{
char *c = (char *)malloc(sizeof(char)*5);
bzero(c, 5);
printf("--%x\n", c);
char c2[] = "abcd";
//c = c2;
```
strcpy(c, c2);
```
printf("--%x\n", c);
printf("--%x\n", c2);
free(c);
c = NULL;
return 0;
}
将指针的赋值操作改为拷贝,这样malloc分配的内存里就有了内容,c的指向也不会改变。
总结:
(1)指针的指向的改变
(2)操作可控内存空间