C语言动态内存常见错误

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。如果不懂可以画画图,就比较好理解了

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值