《c语言深度剖析》学习笔记4

第五章 内存管理


5.1 野指针

> 定义指针变量的同时,最好初始化为NULL,用完指针之后,也将指针变量的值设置为NULL.
5.2 栈、堆和静态区
>静态区:保存自动全局变量和static变量。静态区的内容在整个程序的生命周期内都存在,有编译器编译时分配。
>栈:保存局部变量。栈上的内容只在函数的范围内存在,当函数运行结束的时候,这些内容也自动被销毁。其特点是效率高,但空间大小有限。
>堆:由malloc系列函数或new操作符分配的内存。其生命周期由free或delete决定。其特点是使用灵活,空间比较大,但容易出错。
5.3 常见的内存错误
>指针没有指向一块合法的内存:
>>1.
struct student
{
    char *name;
    int score;
}stu,*pstu;


int main()
{
    pstu = (struct student*)malloc(sizeof(struct student));
    strcpy(pstu->name,"Jimy");
    pstu->score = 99;
    free(pstu);
    return 0;
}
为指针变量pstu分配了内存,但是没有给pstu的成员name分配内存!
>>2.    assert宏在调试时的使用。
>>3.    在定义变量的时候,尽可能地去初始化。
>>4.    内存越界:int a[3]; a[3] = 4;
>>5.    内存泄露:会产生内存泄露的内存就是堆上的内存,即由malloc / new分配的内存。如果用完之后没有即使free/delete,这快内存就无法释放,直到整个程序终止。
>>6.    malloc函数
            函数原型:(void *)malloc(int size);
            函数返回的是void *型,所以必须将其转换成你所接收的类型。
            char *p = (char *)malloc(100);在堆上分配了100个字节内存,返回这块内存的首地址,并强制转换成char *型后赋值给p。这块内存本身没有名字,对它的访问只能通过p来匿名访问。
             如果所申请的内存块大于目前堆上剩余的内存块,则内存分配失败,返回NULL。需要用if(NULL != p)来验证。
             char *p = (char *) malloc(0); 可以申请0字节的内存,但p != NULL;  (p 怎样使用呢?)  
#include <stdio.h>
#include <stdlib.h>


int main()
{
  char *p = (char *)malloc(0);
  printf("%p\n", p);
  *p = 'a';
  printf("%c\n", *p); //output:a
  return 0;
}
>>7.    free函数
free函数,斩断指针变量和这块内存的关系。因为malloc函数分配的内存块都要通过p来访问,free就是把他们俩的关系斩断。
free后,指针变量p保存的地址没有改变,但它对这块地址处的内存已经没有所有权了。这块被释放的内存里面保存的指也没有变,只是再没有办法访问它了。(????)free完之后,如果没有把p指向NULL,p就成为了野指针。
>>对NULL指针的free是什么情况?


第六章 函数


6.1 函数声明的时候,可以省略参数的名字,但定义的时候不能省略。

6.3 getchar()函数的原型:int getchar(void);
6.4 不用全局变量/局部变量编写strlen函数:
int my_strlen(const char *strDest)
{
  assert(NULL != strDest);
  if ('\0' != *strDest)
  {
    return 0;
  }
  else
  {
    return (1 + my_strlen(++strDest));
  }
}


第七章 文件结构


~







评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值