首页天道酬勤c语言局部变量初始化,C语言初始化数组

c语言局部变量初始化,C语言初始化数组

张世龙 05-06 03:35 12次浏览

c语言运行时内存大致分为四个数据区域:常量区域、全局数据区域(静态区域)、堆区域和堆栈区域

定数区

保存了未用于初始化的字符串常数和用const限定的全局变量。 其特点是具有只读、不可写和操作系统运行时保护,如果强行修改,则segmentation fault、生命周期与程序运行过程相同。 /*字符串' hello world '中存在字符串常数区域、全局数据区域

它包含所有全局变量和所有由静态限定的变量(包括全局和本地变量),具有生命周期长且仅初始化一次的特点。 int堆栈区域

所有自动保存(不附加保存型关键字(static等)而修饰或用auto修饰)的局部变量的特征是生命周期短。 只有具有此变量的函数的调用过程,在调用函数时自动分配,在函数返回后回收//num和localnum,是分配给堆栈的许多C/C初学者容易犯的错误之一是指向本地变量的端口堆区

操作系统负责维护的大型内存池,需要手动申请才能使用。 通常调用malloc族函数进行动态内存分配,但使用结束后必须使用free手动释放。 否则,会导致严重的内存泄漏。 所有分配的内存在该过程结束时由操作系统回收,但需要长期运行的服务器程序必须尽量减少内存泄漏(除非程序简单,否则几乎不可能) 常量区域的字符串常量中包含int的哪些数据,如char* p='Hello World '。 编译器将字符串“Hello World”放入常量区域。 在ELF格式中是. rodata的部分。 然而,如果字符串用于字符阵列的初始化,则不能被置于常数区域中,将对应于每4字节的32行转换为整数,并且初始化阵列。 常数区域中可以保存的常数需要用全局变量用const限定,用const限定的局部变量保存在程序运行时堆栈中。 这是无法更改变量的语法级别,可以用指针更改,而不会引起运行时错误,但是更改常量区域的变量值会导致段错误,操作系统会导致进程终止的静态区域的特征静态区域是抽象的、笼统的c的可执行文件没有静态区域,具体地说是主要由两个段组成的:data和. bss段。 其中. data段是程序的数据段,在具有段内存管理的体系结构中,数据段通常是在程序中初始化的、不是0的全局变量或相反,BSS(blockstartedbysymbol )通常是存储程序中未初始化或初始化为0的全局或静态变量的内存区域。 data段在编译程序时固定大小和数据,但. bss段在. data段之后由编译器保留空间,并在程序加载到内存中时正式分配,而不是直接分配空间静态区域由两个不同的段组成,但在程序链接并加载到内存中后,这些段并不区分。

静态区域变量具有以下特征:

生命周期很长,并且会随流程空间回收到系统中,直到流程结束。 初始化后,空间数据在编译过程中初始化,逻辑地址固定在链接中。 那么,哪些变量放在静态区域呢?

全局变量,如果全局定义了一个变量,则在同一程序中,任何函数都可以访问和访问该变量的数据。 基于此,全局变量除了静态区域变量的所有特征之外还具有范围宽的特征,该范围可以在整个程序(由多个源文件构成)中全局看到。 静态变量,字面上静态变量是用static关键字限定的变量,如果用static限定为静态变量,则由编译器分配给静态区域,具有静态区域变量的全部特征。 有两种类型的静态变量:全局静态变量和局部静态变量。 它们都被静态修饰后置于静态区域,具有静态区域变量的所有特征。 区别只是作用域。 对于全局静态变量,该变量的范围被限制为只能在源文件中使用。 (编译后,该变量的符号不允许外部链接,但可以通过指针间接访问。 )如果是局部变量,则由无变化(仅在函数内部使用) static限定的全局变量具有该文件的可视性,但jsddy存储在静态区域堆的动态内存分配中的变量存储在此处。 然后,就在malloc等标准库函数内部是如何管理内存分别写文章。

堆栈区在什么地方,局部变量存储方式