局部变量、局部静态变量、全局变量和全局静态变量之间的区别如下:
本文引用的地址:
局部变量:堆栈区域;
局部静态变量:静态区域;
全局变量:静态区域的常数区域;
全局静态变量:静态区域。
在C/C++编程中,程序员需要更准确地了解内存。需要经常操作的内存可以分为以下几类:
1.堆栈:编译器自动分配和释放并存储函数的参数值和局部变量的值。它像数据结构中的堆栈一样工作。
2.堆:一般由程序员分配和释放。如果程序员不释放它,它可能会在程序结束时被OS回收。注意在数据结构上和堆不一样,分配方式和链表差不多,呵呵。
3.静态区域:全局变量和静态变量存储在一起,初始化的全局变量和静态变量在一个区域,未初始化的全局变量和未初始化的静态变量在另一个相邻区域。
4.文本常量区域:这是放置常量字符串的地方。
5.程序代码区:存储函数体的二进制代码。
下面是一个实用的程序代码:
int a = 0;全局初始化区
char * p1全局未初始化区域
主()
{
int b;棚
char s[]= & # 34;abc & # 34;棚
char * p2棚
char * p3 = & # 34123456";123456在常量区,p3在堆栈上。
静态int c = 0;全局(静态)初始化区
P1 =(char *)malloc(10);
p2 =(char *)malloc(20);
分配有10和20字节的区域位于堆区域。
strcpy(p1,& # 34;123456");123456放在常量区,编译器可能会把它与& # 34;123456"优化成一个地方。
}
在C语言的程序中,使用变量时要注意以下几点。
体中定义的变量通常在堆栈上,不需要在程序中管理,而是由编译器处理。
malloc、calloc、realloc等内存分配函数分配的内存空间都在堆上,程序必须保证它是空闲的,否则会发生内存泄漏。
所有函数在体外都定义为全局变量,用static添加的变量无论在函数内部还是外部都放在全局区域。
const定义的变量将放在程序的只读数据区。
程序中间部分的使用
我们用一个简单的例子来说明C语言中变量和段的对应关系。C语言程序中的全局区(静态区)实际上对应的是以下几个段:RO数据;RW数据;BSS数据。
一般来说,直接定义的全局变量在未初始化的数据区。如果变量是初始化的,它在初始化数据区(RW数据),const会放在只读数据区。
示例:const char ro[]= { & # 34;这是只读数据& # 34;};//只读数据区
静态字符rw _ 1[]= { & # 34;这是全局读写数据& # 34;};//读写数据段已经初始化。
char BSS _ 1[100];//未初始化的数据段
const char * ptrconst = & # 34常量数据& # 34;;//字符串放在只读数据段中。
int main()
{
短b;//在堆栈上,需要2个字节。
char a[100];//在堆栈上打开100个字节,work的值是它的第一个地址。
char s[]= & # 34;abcdefg & # 34;//s在堆栈上,占用4个字节。
//“abcdefg”本身放在只读数据存储区,占8个字节。
char * p1//p1在堆栈上,占用4个字节。
char * p2 = & # 34123456";//p2在堆栈上,p2指向的内容不能改变。
//"123456 "读取中间的数据区。
静态字符rw _ 2[]= { & # 34;这是本地读写数据& # 34;};//读/写数据段部分初始化
静态字符BSS _ 2[100];//本地未初始化的数据段
静态int c = 0;//全局(静态)初始化区域
P1 =(char *)malloc(10 * sizeof(char));//在堆区分配内存区域
strcpy(p1,& # 34;xxxx & # 34);//“xxxx”放在只读数据区,占5个字节。
免费(P1);//释放p1指向的内存。
返回0;
}
微信扫码
QQ扫码
您的IP:10.1.228.218,2026-01-03 05:04:36,Processed in 0.25876 second(s).