服务器经常崩溃??看看简单的内存知识:C语言—内存管理

学习重点 :

1.全面掌握变量的特性,了解内存管理的概念.

2.全面掌握函数的使用.

局部变量与全局变量:

局部变量:就是在函数内部定义的变量.局部变量只在本函数内有效,也就是只能在本函数内使用它.

全局变量:就是在所有函数(包括main函数)外部定义的变量.全局变量在整个源文件中有效,故全局变量可以在源文件中的任何地方使用.

注 : c语言中,允许全局变量与局部变量重名,但全局变量不影响局部变量的值,也就是实际使用的是局部变量的值.

变量的特性 :

1.存储期 : 也称为生存期,表示变量在内存中存在的时间的长短.

静态存储期 :

在程序编译时就分配内存空间并保持不变,程序执行结束后才释放.

动态存储期 :

在程序执行并使用该变量的时候分配内存空间,使用完毕立即释放.

2.链接点 : 表示变量能在哪些范围内使用.

内部链接 : 只能在源文件内部使用.

外部链接 : 能在源文件内部和外部文件中使用.

空连接 : 只能在代码块内(函数内部)使用.

3.作用域 : 表示变量在哪些范围内起作用,由链接点决定.

1.局部变量 : 定义与声明不区分(定义之后可以直接使用).

a.自动变量 : 使用auto关键字修饰存储类型,一般缺省.

定义声明 : [auto] ; //一般auto不写 int a;直接这样普通定义就行

变量特性 : 动态存储期,空链接,代码块作用域.

b.静态局部变量 : 使用static关键字修饰存储类型.

定义声明 : ; //static int a;

变量特性 : 静态存储期,空链接,代码块作用域.

c.寄存器变量 : 使用register关键字修饰存储类型.

register是一个请求命令,暗示该变量将被频繁使用,请求保存在cpu寄存器中.用register修饰的变量的值必须是单个值,数据

长度小于或等于整型数据长度.因为变量的值可能存放在寄存器中,所以不能使用取地址符’&’获取该变量的地址.

定义声明 : ; //register int a;

变量特性 : 动态存储期,空链接,代码块作用域.

2.全局变量 : 定义与声明有些地方需要区分.

a.普通全局变量 :

定义 : ;

声明 : 引用源文件内部普通全局变量不需要声明.

引用外部文件普通全局变量需要进行申明 : ;

变量特性 : 静态存储期,外部链接,源文件内部及外部文件作用域.

b.静态全局变量 :

定义 : ;

声明 : 引用静态全局变量不需要申明.

变量特性 : 静态存储期,内部链接,源文件内部作用域.

注 : 静态存储期的变量并不一定是静态变量.比如普通全局变量.

内存管理:

程序一般是保存在计算机的外存中,运行时自搬移到内存中进行运行.

C语言中定义4个内存区间: 代码区,静态存储区,栈区,堆区.

1.代码区 : 用于存放程序中的代码,属性只读.

2.静态存储区: 用于存放普通全局变量,静态变量(静态全局变量,静态局部变量),以及常量.

3.动态存储区:

栈区 : 用于存放普通局部变量.

堆区 : 由程序员自行决定申请和释放的内存空间,称之为堆区.

典型的例子就是定义结构体指针后,需要使用malloc()申请结构体指针指向的内存空间.

函数:

1.函数的定义 : [static] (形参表)

{

……

return 表达式;

} //例子:static int test(int x);

static关键字说明该函数只能在源文件内部使用,为可选项.

2.函数的声明 : [extern] (形参表);

extern关键字表明该函数在被调用时,在外部文件中查找函数的定义,为可选项目.

3.函数的调用 : 被调函数必须时已经在调用函数之前声明,或者被调函数在调用函数之前定义.

调用方法 : 函数名(实参表);

4.指针函数 : 函数的返回值是一个指针.

定义 : [static] (形参表)

{

……

return p; //p是一个指针变量.

}

思考题目 : 下面哪个函数能使调用函数读到”hello world!”这个字符串.

char *fun() char *fun1()

{ {

char arr[] = “hello world!”; char *p = “hello world!”;

return arr; return p;

} }

结果可以发现char *fun1()返回了字符串”hello world!”,但是char fun();没有返回”hello world!”,这是为什么呢???还记得之前说的静态储存区嘛???

静态储存区存放常亮而”hello world!”便是一个常亮储存在静态储存区中,然而char arr[];这是普通全局局部变量,所以fun()返回的是一个野指针因为fun()程序结束后就自行释放内存空间,而char *p不同这不是一个普通变量这是一个指向常量首地址的指针,所以它在静态储存区中,所以然后可以返回值啦。因为程序没结束,静态储存区中内存空间还没有没有释放。

5.函数指针 : 指针指向的是函数的首地址,也就是用来存放函数入口地址的指针.

函数指针的定义 : (*函数指针变量名)(函数形参表);

对应的函数的定义 : (函数形参表)

{

……

return 函数返回值;

}

函数指针使用方法 : 将函数名(实际就是函数的入口地址)赋值给对应的函数指针,通过对函数指针的使用即可实现对对应函数的调用.

6.函数特殊参数的传递:

函数的形参是指针:

当指针作为实参传递给函数时,对指针进行解引用会直接改变指针指向的存储空间中的数据.

当数组作为实参传递给函数时,实际传递的是同级别的指针.

如果大家对C/C++感兴趣的话,本小编这里准备了一大堆的学习资料可以免费分享给有需要的朋友们,大家关注我或者私信我回复“资料”都可免费领取一份学习资料哦!!!!

免责声明:非本网注明原创的信息,皆为程序自动获取互联网,目的在于传递更多信息,并不代表本网赞同其观点和对其真实性负责;如该页面侵犯到您的权益,请给站长发送邮件,并提供相关证明(版权证明、身份证正反面、侵权链接),站长将在收到邮件12小时内删除。