计算机系统中有四个内存区域:1)栈:在栈里面储存一些我们定义的局部变量以及形参;2)字符常量区:主要是储存一些字符常量;3)全局区:在全局区里储存一些全局变量和静态变量;4)堆:堆主要是通过动态分配的储存空间,即以下讲的讲的动态分配内存空间。
定义int型指针int *p,p是用来储存一个地址的值的,我们之所以要为p分配空间是让它有一个明确的指向,比如你现在做好了一个指向方向的路标,但是你并没有让这个路标指向一个确切的方位,这个路标是瞎指的,这样我们就不能够通过它来明确到底哪里是东,哪里是西了。也就是说在计算机的内存里定义了一个指针变量,但是我们并没有让这个变量指示一个确切int类型变量的地址,所以必须要让它有一个明确的指示方向。所以就要通过动态分配内存的方式来认为的规定确定其方向。
当malloc()函数为一个指针变量p分配了地址,当对p结束操作的时候要释放p的内存空间。动态分配的变量时储存在堆里面,但是这个堆的空间不是无限大的,也许当编一个小的程序的时候可能不会产生影响,但是对于那些大的程序,如果不及时释放堆的空间就会发生内存泄露。所谓内存泄露是因为堆的空间被我们动态分配用完了,这样再去使用动态分配堆的空间的时候就没有足够的空间可以使用了,这样就需要占有原来的空间,也就是会把其他的空间来储存我们键入的值,这样会导致原来储存的数据被冲掉,导致了内存泄露。
而且当使用malloc()函数释放完空间,还要将原先的指针变量赋予一个NULL,也就是赋予一个空指针,留着下次的时候使用它。如果不赋予一个空指针这样会导致原来的指针变量变成了一个野指针,就是一个没有明确指向的指针,系统不知道它会指向什么地方,会是系统crash。
注:动态的分配内存。可以做到准确分配空间大小,不浪费资源,而且也不会发生程序不断使用预先分配内存不足。动态分配的内存空间系统不负责自动回收,需要写代码手动释放。
相对于malloc()函数,calloc()函数就不需要我们赋予NULL了,这是因为在每次调用完calloc()函数的时候系统会自动将原先的指针赋予一个空指针。除了malloc()、calloc(),还有realloc()函数,比前两个函数分配更多的空间。
例子
1.指针的初始化
初始化不是指针的动态分配内存,但类似malloc函数,也就是让指针变量有确定的方向或者有确定的地址指向。
1)定义并初始化
int a = 10;
int*p = &a;
2)先定义再初始化
int a =10;
int*p;
p = &a;
实例:
#include <stdio.h>
int main(){
int a = 10, b = 20, c = 30;
int *p = &a; //定义指针变量
*p = b; //通过指针变量修改内存上的数据
c = *p; //通过指针变量获取内存上的数据
printf("%d, %d, %d, %d\n", a, b, c, *p);
return 0;
}
运行结果:20,20,20,20
2.字符串指针
1)定义并赋值
char *pstr = "Hello World!";
2)先定义再赋值
char str[] = "Hello World!";
char *pstr;
if(str)
{
*pstr = malloc(strlen(str)+1);
strncpy(pstr,str,strlen(str)+1);
}
else
{
pstr = NULL;
}
用完之后:
if(str)
{
free(pstr);
pstr = NULL;
}
原文:https://www.cnblogs.com/xinghuo123/p/11986121.html