C语言——内存管理问题

常见的内存错误及解决方法

一、结构体成员指针未初始化
eg:

#include <stdio.h>
#include <string.h>

struct student
{
	char *name;
	int score;
}stu,*pstu;

int main()
{
	strcpy(stu.name,"pddddd");
	stu.score=99;
	printf("%s\n",stu.name);
	printf("%d\n",stu.score);
	return 0;
}

运行结果:
在这里插入图片描述
原因分析:
答:定义的结构体变量stu分配了char *类型的指针和int类型整形变量;结构体中的字符指针name没有指向合法的地址。

解决方法:
答:在使用时为字符串指针name动态开辟空间。

#include <stdio.h>

struct student
{
    char *name;
    int score;
}stu,*pstu;

int main()
{
    stu.name=(char *)malloc(8);
    strcpy(stu.name,"pddddd");
    printf("%s\n",stu.name);

}

二、没有为结构体指针分配足够的内存

#include <stdio.h>

struct student
{
    char *name;
    int score;
}stu,*pstu;   			//定义了结构体指针变量

int main()
{
    pstu=(struct student *)malloc(sizeof(struct student));	//为结构体指针开辟空间
    pstu->name=(char *)malloc(8);
    strcpy(pstu->name,"pddddddd");
    printf("%s\n",pstu->name);

}

三、函数的入口校验
1.指针在定义时初始化为NULL;
2.在函数入口使用assert(NULL!=p)对参数进行校验。在非参数的地方使用if(NULL!=p)来校验。

四、为指针分配的内存太小

#include <stdio.h>
#include <string.h>
int main()
{
    char *p1="abcdefg"; //长度为8
    char *p2=(char *)malloc(sizeof(char)*strlen(p1)+1*sizeof(char));    //strlen计算昌都市没有包含'\0',需要手动加上
    strcpy(p2,p1);
    printf("%s\n",p2);
}

注意:
只有字符串常量才有结束标志符。
比如下面这种写法就没有结束标志符了:chara[7]={‘a’,’b’,’c’,’d’,’e’,’f’,’g’};

五、内存分配成功,但并未初始化
对于还不确定初值的变量初始化

int i=0;
char *p=NULL;
int a[10]={0};memset(a,0,sizeof(a));

六、内存越界
eg:

int a[10]={0};
for(i=0;i<=10;i++)     //此时有11个数字,发生了越界
{
	a[i]=i;
}

七、内存泄漏
问题出处:堆上由malloc或new操作符分配的内存
解决办法:使用完后及时free或delete,否者这块内存将无法释放,知道整个程序终止

八、malloc函数用法
使用要求:
1.内存分配的对象
2.分配的内存大小
3.是否还有足够内存分配
4.内存将用来存储什么格式的数据
5.分配好的内存存在哪里

void *malloc(int size);
返回值:一个void类型的指针
参数:int类型,即申请分配的内存的大小,单位是byte

内存分配成功后,malloc函数返回内存的首地址,需要一个指针来接受这个地址,但需要对指针的返回值进行强制转换
eg:

char *p=(char *)malloc(100)
可通过指针p来操作这块内存(匿名访问),malloc申请的是一块连续的内存

注:若申请分配的内存大于剩余的内存,即分配失败,函数会返回NULL。若申请的是0字节的内存,虽然返回一个正常的内存地址,但无法使用。

九、内存释放
使用free( )函数释放
功能:斩断内存和指针的关系,指针变量本身保存的地址不变,但它对这个地址处的那块内存没有使用权。
注意:释放完后,需要重新给指针定义为NULL

十、内存已经被释放了,但是继续通过指针来使用
①free(p)之后,继续通过p指针来访问内存。解决的办法就是给p置NULL。
②函数返回栈内存
③内存使用太复杂,弄不清到底哪块内存被释放,哪块没有被释放。解决的办法是重新设计程序,改善对象之间的调用关系。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值