1.对NIULL指针进行解引用操作
void test()
{
int *p = (int *)malloc(INT_MAX/4);
*p = 20;//如果p的值是NULL,就会有问题
free(p);
}
如果malloc开辟内存失败返回空指针的话,在解引用就会有问题。
2.对动态开辟空间的访问
void test()
{
int i = 0;
int *p = (int *)malloc(10*sizeof(int));//40个字节
if(NULL == p)
{
exit(EXIT_FAILURE);
}
for(i=0; i<=10; i++)
{
*(p+i) = i;//当i是10的时候越界访问
}
free(p);
}
这里开辟的空间是40个字节,不是元素。
*(p+i)每次跳过一个整形。也就是说只能打印到0-9。
3.对非动态开辟内存使用free释放
void test()
{
int a = 10;
int *p = &a;
free(p);
}
编译器规定就是不能对非动态开辟内存进行free。
4.使用
free
释放一块动态开辟内存的一部分
void test()
{
int *p = (int *)malloc(100);
p++;
free(p);//p不再指向动态内存的起始位置
}
p指向的位置变了,而是指向了内存的一部分。(起始位置变了之后找不到这一整块空间)
5.对同一块动态内存多次释放
void test()
{
int *p = (int *)malloc(100);
free(p);
//如果在这把p置为NULL就不会有问题.下面的free就什么都不会做
//p=NULL;
free(p);//重复释放
}
6.动态开辟内存忘记释放(内存泄漏)
void test()
{
int *p = (int *)malloc(100);
if(NULL != p)
{
*p = 20;
}
}
int main()
{
test();
//在这里没有free就会造成内存泄漏
while(1);
}
看一道例题
void GetMemory(char *p)
{
p = (char *)malloc(100);
}
void Test(void)
{
char *str = NULL;
GetMemory(str);
strcpy(str, "hello world");
printf(str);
}
p里面存的是malloc开辟空间的首地址,但对str一点影响都没有,str到最后还是NULL。在对NULL
使用strcpy就会出错
正确写法
void GetMemory(char **p)
{
*p = (char *)malloc(100);
}
void Test(void)
{
char *str = NULL;
GetMemory(&str);
strcpy(str, "hello world");
printf(str);
}
*p就是str。如果不懂可以画画图,就比较好理解了