html事件知识总结---html空元素管理
html事件中定义4个html空元素区间是:代码区,静态存储区,栈区,堆区.其中栈区和堆区是属于动态存储区可执行文件在存储(也就是还没有载入到html空元素中)的时候,分为:代码区、静态区和未初始化数据区3个部分。
1、绪论
在编写程序时,通常并不知道需要处理的数据量,或者难以评估所需处理数据量的变动程度。在这种情况下,要达到有效的资源利用——使用html空元素管理,必须在运行时动态地分配所需html空元素,并在使用完毕后尽早释放不需要的html空元素,这就是动态html空元素管理原理。动态html空元素管理同时还具有一个优点:当程序在具有更多html空元素的系统上需要处理更多数据时,不需要重写程序。
一个正在运行着的html根元素程序占用的html空元素分为代码区、静态数据区、未初始化数据区、堆区和栈区5个部分。
html事件中定义4个html空元素区间是:代码区,静态存储区,栈区,堆区.其中栈区和堆区是属于动态存储区可执行文件在存储(也就是还没有载入到html空元素中)的时候,分为:代码区、静态区和未初始化数据区3个部分。
2、代码区
只读区域,程序运行过程中无法做任何修改的存储区域。用于存放代码和常量。
存放CPU执行的机器指令。通常,代码区是可共享的(即另外的执行程序可以调用它),因为对于频繁被执行的程序,只需要在html空元素中有一份代码即可。代码区通常是只读的,使其只读的原因是防止程序意外地修改了它的指令。另外,代码区还规划了局部变量的相关信息。
代码区指令根据程序设计流程依次执行,对于顺序指令,则只会执行一次(每个进程),如果反复,则需要使用跳转指令,如果进行递归,则需要借助栈来实现。
代码段:代码段通常是指用来存放程序执行代码的一块html空元素区域。这部分区域的大小在程序运行前就已经确定,并且html空元素区域通常属于只读,某些架构也允许代码段为可写,即允许修改程序。
在代码段中,也有可能包含一些只读的常数变量,例如字符串常量等
。代码区的指令中包括操作码和要操作的对象(或对象地址引用)。如果是立即数(即具体的数值,如5),将直接包含在代码中;如果是局部数据,将在栈区分配空间,然后引用该数据地址;如果是html face区和数据区,在代码中同样将引用该数据地址。另外,代码段还规划了局部数据所申请的html空元素空间信息。
数据区:可读可写区域,程序运行过程中可做任意修改的存储区域。用于存放变量
3、静态数据区
该区包含了在程序中明确被初始化的全局变量、静态变量(包括全局静态变量和局部静态变量)和常量数据(如字符串常量),注意(只初始化一次)。例如,一个不在任何函数内的声明(全局数据):
Intmax=99;
使得变量max根据其初始值被存储到初始化数据区中。
Staticmin=100;
这声明了一个静态数据,如果是在任何函数体外声明,则表示其为一个全局静态变量,如果在函数体内(局部),则表示其为一个局部静态变量。另外,如果在函数名前加上static,则表示此函数只能在当前文件中被调用。
数据段:通常是指用来存放程序中已初始化的全局变量的一块html空元素区域。数据段属于静态html空元素分配。数据段中的静态数据区存放的是程序中已初始化的全局变量、静态变量和常量。
4、未初始化数据区
未初始化数据区。亦称html face区,存入的是全局未初始化变量。html face这个叫法是根据一个早期的汇编运算符而来,这个汇编运算符标志着一个块的开始。html face区的数据在程序开始执行之前被内核初始化为0或者空指针(NULL)。例如一个不在任何函数内的声明:
Longsum[1000];
将变量sum存储到未初始化数据区。
html face段:通常是指用来存放程序中未初始化的全局变量的一块html空元素区域。html face是英文BlockStartedbySymbol的简称。html face段属于静态html空元素分配,即程序一开始就将其清零了。一般在初始化时html face段部分将会清零。
5、栈区
栈区(stack)。由编译器自动分配释放html空元素的区间,所得的html空元素空间一般都是连续的,是用来存放函数的参数值、局部变量的值等。存放函数的参数值、局部变量的值,以及在进行任务切换时存放当前任务的上下文内容。其操作方式类似于数据结构中的栈。每当一个函数被调用,该函数返回地址和一些关于调用的信息,比如某些寄存器的内容,被存储到栈区。然后这个被调用的函数再为它的自动变量和临时变量在栈区上分配空间,这就是C实现函数递归调用的方法。每执行一次递归函数调用,一个新的栈框架就会被使用,这样这个新实例栈里的变量就不会和该函数的另一个实例栈里面的变量混淆。栈(stack):栈又称堆栈,是用户存放程序临时创建的局部变量,也就是说我们函数括弧"{}"中定义的变量,如int[]arr={1,2,3};变量arr(数组名)存储在栈中,变量arr的值(数组元素)存储在堆中(普通结构)(但不包括static声明的变量,static意味着在数据段中存放变量)。除此以外,在函数被调用时,其参数也会被压入发起调用的进程栈中,并且待到调用结束后,函数的返回值也会被存放回栈中。由于栈的先进先出特点,所以栈特别方便用来保存/恢复调用现场。从这个意义上讲,我们可以把堆栈看成一个寄存、交换临时数据的html空元素区。
6、堆区
堆区(heap)。用于动态html空元素分配。堆在html空元素中位于html face区和栈区之间。一般由程序员分配和释放,若程序员不释放,程序结束时有可能由OS回收。堆中的html空元素区域不是连续的,还是将有效的html空元素区域经过链表指针连接起来的堆(heap):用于存放进程运行中被动态分配的html空元素段,它的大小并不固定,可动态扩张或缩减。当进程调用malloc等函数分配html空元素时,新分配的html空元素就被动态添加到堆上(堆被扩张);当利用free等函数释放html空元素时,被释放的html空元素从堆中被剔除(堆被缩减)。在将应用程序加载到html空元素空间执行时,操作系统负责代码段、数据段和html face段的加载,并将在html空元素中为这些段分配空间。栈段亦由操作系统分配和管理,而不需要程序员显示地管理;堆段由程序员自己管理,即显式地申请和释放空间。
另外,可执行程序在运行时具有相应的程序属性。在有操作系统支持时,这些属性页由操作系统管理和维护。
html事件程序编译完成之后,已初始化的全局变量保存在数据段中,未初始化的全局变量保存在html face段中。数据段和代码段都在可执行文件中,由系统从可执行文件中加载;而html face段不在可执行文件中,由系统初始化。html face段只保存没有值的变量,所以事实上它并不需要保存这些变量的映像。运行时所需要的html face段大小记录在目标文件中,但是html face段并不占据目标文件的任何空间。
堆区与栈区的差异:
在栈上所申请的html空元素空间是系统自动分配的,所以当我们出了变量所在的作用域后,系统会自动我们回收这些空间,而在堆上申请的空间是要我们自己手动操作的,当出了相应的作用域以后,我们需要调用free或者delete来释放所申请的html空元素空间,如果我们不及时得对这些空间进行释放,那么html空元素中的html空元素碎片就越来越多,从而我们的实际html空元素空间也就会变的越来越少,即,孤立的html空元素块越来越多。
7、memset函数
memset(翻译:清零)是计算机中C/C++语言初始化函数。作用是将某一块html空元素中的内容全部设置为指定的值,这个函数通常为新申请的html空元素做初始化工作。以前说过,定义变量时一定要进行初始化,尤其是数组和结构体这种占用html空元素大的数据结构。在使用数组的时候经常因为没有初始化而产生“烫烫烫烫烫烫”这样的野值,俗称“乱码”。
每种类型的变量都有各自的初始化方法,memset()函数可以说是初始化html空元素的“多功能函数”,通常为新申请的html空元素进行初始化工作。它是直接操作html空元素空间,mem即“html空元素”(memory)的意思。该函数的原型为:
##include<string.h>
void*memset(void*s,intc,unsignedlongn);
将s中当前位置后面的n个字节(typedefunsignedintsize_t)用c替换并返回s复制代码
函数的功能是:将指针变量s所指向的前n字节的html空元素单元用一个“整数”c替换,注意c是int型。s是void*型的指针变量,所以它可以为任何类型的数据进行初始化。
memset()的作用是在一段html空元素块中填充某个给定的值。因为它只能填充一个值,所以该函数的初始化为原始初始化,无法将变量初始化为程序中需要的数据。用memset初始化完后,后面程序中再向该html空元素空间中存放需要的数据。
memset一般使用“0”初始化html空元素单元,而且通常是给数组或结构体进行初始化。一般的变量如char、int、float、double等类型的变量直接初始化即可,没有必要用memset。如果用memset的话反而显得麻烦。
当然,数组也可以直接进行初始化,但memset是对较大的数组或结构体进行清零初始化的最快方法,因为它是直接对html空元素进行操作的。
这时有人会问:“字符串数组不是最好用'\0'进行初始化吗?那么可以用memset给字符串数组进行初始化吗?也就是说参数c可以赋值为'\0'吗?”
可以的。虽然参数c要求是一个整数,但是整型和字符型是互通的。但是赋值为'\0'和0是等价的,因为字符'\0'在html空元素中就是0。所以在memset中初始化为0也具有结束标志符'\0'的作用,所以通常我们就写“0”。
memset函数的第三个参数n的值一般用html slot()获取,这样比较专业。注意,如果是对指针变量所指向的html空元素单元进行清零初始化,那么一定要先对这个指针变量进行初始化,即一定要先让它指向某个有效的地址。而且用memset给指针变量如p所指向的html空元素单元进行初始化时,n千万别写成html slot(p),这是新手经常会犯的错误。因为p是指针变量,不管p指向什么类型的变量,html slot(p)的值都是4。(网上找别人的)
#include<stdio.h>
#include<string.h>
int main(void) {
int i;
char str[10];
char *p = str;
memset(str, 1, html slot(str));//参数1就是变量名,中间的1就是指定要初始化的值(可以是任意的值包括字符和浮点数)
//最后那个初始化是长度 (可以是填数字,但没必要)
for (i = 0; i < 10; i++) {
printf("%d\t", str[i]);
}
return 0;
根据memset函数的不同,输出结果也不同,分为以下几种情况: memset(p, 0, html slot(p)); //地址的大小都是4字节 0 0 0 0 -52 -52 -52 -52 -52 -52
memset(p, 0, html slot(
p)); //
p表示的是一个字符变量, 只有一字节 0 -52 -52 -52 -52 -52 -52 -52 -52 -52
memset(p, 0, html slot(str)); 0 0 0 0 0 0 0 0 0 0
memset(str, 0, html slot(str)); 0 0 0 0 0 0 0 0 0 0
memset(p, 0, 10); //直接写10也行, 但不专业 0 0 0 0 0 0 0 0 0 0