计算机的系统中有四个内存区域:
1)栈:栈里面储存局部变量以及形参;
2)字符常量区:主要是储存一些字符常量,比如:char *p_str=”hello”;其中”hello”就储存在字符常量区里面;
3)全局区:在全局区里储存一些全局变量和(static)静态变量;
4)堆:堆主要是通过动态分配的储存空间。
什么时候我们需要动态分配内存空间呢?
我们定义了一个指向int类型的指针p;
int *p;
p是用来储存一个变量的地址(默认是随机的一个值),所以我们必须要给它初始化一个地址,后序的对指针p的操作才有意义。
这样我们就可以使用“动态分配内存”的方式来给p分配内存!
于是,有些新手有下面一段代码:
int *p;
int a=0;
p=&a;
这种方法可不是指针的动态分配内存,这个叫做指针变量的初始化!
int *p=NULL;
p=(int *)malloc(n*sizeof(int));
我们是通过malloc()函数为一个指针变量p分配了地址。
这样我们就可以对这个p进行具体的操作了,比如scanf(“%s”,p)。
当我们对p结束操作的时候还要释放p的内存空间。可以使用free(p),来释放指针p指向的空间(指针p还是存在的)。
如果不释放内存,可能会造成“内存泄露”。
所谓内存泄露是因为堆的内存空间被动态分配用完了,这样再去使用动态分配堆的空间的时候就没有足够的空间让我们使用了,这样会导致原来储存的数据被破坏掉,导致了内存的泄露了。
同时,还应该注意当我们释放完空间的时候还要将原先的指针变量赋予一个NULL,也就是赋予一个空指针,留着下次的时候使用它!
如果我们不赋予一个空指针这样会导致原先的指针变量成为了一个野指针!野指针就是一个没有明确指向的指针,野指针会给程序设计带来隐患,因此当我们每次使用完malloc()函数的时候都必须将指针赋予一个空指针!