C语言深入理解——内存管理

1.野指针

定义之后没有被初始化和使用,用完之后没有释放。所以定义完指针变量之后一定要将其初始化为NULL。

2.堆栈和静态区

静态区:自动全局变量、static的全局、局部变量,静态区的生命周期是整个程序,是由编译器进行分配的。

栈区:保存局部变量、形参,在函数范围内存在。

堆区:由程序员用malloc和new等操作符进行内存的分配。其生命周期是由free和delete决定的。

常见的内存错误问题

1.结构体成员的指针没有初始化

如图定义了一个结构体,结构体里面定义了一个指针变量。当使用strcpy时,因为name指针并没有指向实际的内存地址,所以会发生错误。

但是有时在使用结构体指针分配内存的时候要注意,其分配还是四个字节的指针内存。

要想解决上面的问题,解决的方法就是直接给name指针分配需要的内存大小。

注意事项:

1.不管什么时候在使用指针搞的时候都要确保指针的有效性。

一般在函数入口处使用 assert(NULL != p)对参数进行校验。在非参数的地方使用

ifNULL != p)来校验。但这都有一个要求,即 p 在定义的同时被初始化为 NULL 了。

2.在为字符串常量分配内存时要注意“\0”

char *p2 = (char *)malloc(sizeof(char)*strlen(p1)+1*sizeof(char));

3.内存分配成功后,一定要初始化。

int i = 0char *p = NULL

如果定义的是数组的话,可以这样初始化: int a[10] = {0};

或者用 memset 函数来初始化为 0memseta,0,sizeof(a);

 

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值