家电维修网

 找回密码
 注册
家电维修网 网站首页 电脑维修 查看内容

单片机中C语言的程序与数据存储

2018-12-1 15:31| 发布者: 南召修电视| 查看: 310| 评论: 0

摘要: 一、五大内存分区:内存分成5个区,它们分别是堆、栈、自由存储区、全局/静态存储区和常量存储区。1、栈区(stack):FIFO就是那些由编译器在需要的时候分配,在不需要的时候自动清除的变量的存储区。里面的变量通常是 ...
单片机中C语言的程序与数据存储


说明:


1、只读数据段需要包括程序中定义的const型的数据(如:const char ro[]),还包括程序中需要使用的数据如“123456”。对于const char ro[]和const char * ptrconst的定义,它们指向的内存都位于只读数据据区,其指向的内容都不允许修改。区别在于前者不允许在程序中修改ro的值,后者允许在程序中修改ptrconst本身的值。对于后者,改写成以下的形式,将不允许在程序中修改ptrconst本身的值:


const char * const ptrconst = “const data”;


2、读写数据段包含了已经初始化的全局变量static char rw1[]以及局部静态变量static char


rw2[]。rw1和rw2的差别在于编译时,是在函数内部使用的还是可以在整个文件中使用。对于前者,static修饰在于控制程序的其他文件时候可以访问rw1变量,假如有static修饰,将不能在其他的C语言源文件中使用rw1,这种影响针对编译-连接的特性,但无论有static,变量rw1都将被放置在读写数据段。对于后者rw2,它是局部的静态变量,放置在读写数据区;假如不使用static修饰,其意义将完全改变,它将会是开辟在栈空间局部变量,而不是静态变量。


3、未初始化数据段,事例1中的bss_1[100]和 bss_2[200]在程序中代表未初始化的数据段。其区别在于前者是全局的变量,在所有文件中都可以使用;后者是局部的变量,只在函数内部使用。未初始化数据段不设置后面的初始化数值,因此必须使用数值指定区域的大小,编译器将根据大小设置BBS中需要增加的长度。


4、栈空间包括函数中内部使用的变量如short b和char a[100],以及char *p1中p1这个变量的值。


1)变量p1指向的内存建立在堆空间上,堆空间只能在程序内部使用,但是堆空间(例如p1指向的内存)可以作为返回值传递给其他函数处理。


2)栈空间主要用于以下3类数据的存储:


a、函数内部的动态变量


b、函数的参数


c、函数的返回值


3)栈空间主要的用处是供函数内部的动态变量使用,变量的空间在函数开始之前开辟,在函数退出后由编译器自动回收。看一个例:


int main( )


{


char *p = "tiger";


p[1] = 'I';


p++;


printf("%s\n",p);


}


编译后提示:段错误


分析:


char *p = "tiger";系统在栈上开辟了4个字节存储p的数值。"tiger"在只读存储区中存储,因此"tiger"的内容不能改变,*p="tiger",表示地址赋值,因此,p指向了只读存储区,因此改变p指向的内容会引起段错误。但是因为p是存放在栈上,因此p的数值是可以改变的,因此p++是正确的。


六、const的使用


1、前言:


const是一个C语言的关键字,它限定一个变量不允许被改变。使用const在一定程序上可以提高程序的健壮性,另外,在观看别人代码的时候,清晰理解const所起的作用,对理解别人的程序有所帮助。


2、const变量和常量


1)const修饰的变量,其值存放在只读数据段中,其值不能被改变。称为只读变量。


其形式为 const int a=5;此处可以用a代替5


2)常量:其也存在只读数据段中,其数值也不能被改变。其形式为"abc" ,5


3、const 变量和const限定的内容,先看一个事例:


typedef char* pStr;


int main( )


{


char string[6] = “tiger”;


const char *p1 = string;


const pStr p2 = string;


p1++;


p2++;


printf(“p1=%s\np2=%s\n”,p1,p2);


}


程序经过编译后,提示错误为


error:increment of read-only variable ‘p2’


1)const 使用的基本形式为:const char m;


//限定m 不可变


2)替换1式中的m,const char *pm;


//限定*pm不可变,当然pm是可变的,因此p1++是对的。


3)替换1式中的char,const newType m;


//限定m不可变,问题中的pStr是一种新类型,因此问题中p2不可变,p2++是错误的。


4、const 和指针


类型声明中const用来修饰一个常量,有如下两种写法:


1)const在前面


const int nValue;//nValue是const


const char *pContent;//*pContent是const,pConst可变


const (char *)pContent;//pContent是const,*pContent可变


char *const pContent;//pContent是const,*pContent可变

最新评论

电脑维修热门推荐文章