百度笔试题:全局变量和有些变量在内存中的分化

(1)栈(stack):由编译器进行管理,自动分配和假释,存放函数调用过程中的各样参数、局地变量、重临值以及函数重回地址。操作形式接近数据结构中的栈。

(3)全局(静态)存储区:分为DATA段和BSS段。DATA段(全局发轫化区)存放开首化的全局变量和静态变量;BSS段(全局未初阶化区)存放未起头化的全局变量和静态变量。程序运行为止时自动释放。其中BBS段在程序执行此前会被系统活动清0,所以未初阶化的全局变量和静态变量在程序执行往日曾经为0。

请回复全局变量和一部分变量在内存中是还是不是有分别?即便有,是何等不同?

(4)文字常量区:存放常量字符串。程序截至后由系统释放。

答:有分别。全局变量保存在内存的全局存储区中,占用静态的存储单元;局地变量保存在栈中,唯有在所在函数被调用时才动态地为变量分配存储单元。

该难题的解析如下:

(5)程序代码区:存放程序的二进制代码。

肯定,C语言中的全局变量和局地变量在内存中是有分其他。C语言中的全局变量包涵外部变量和静态变量,均是保留在大局存储区中,占用永久性的存储单元;局地变量,即活动变量,保存在栈中,唯有在所在函数被调用时才由系统动态在栈中分配临时性的存储单元。

有这么一道笔课题,包涵百度、Samsung在内的广大商厦都曾在笔试面试中出过该难题:

该难题考查的知识点是变量的囤积类型及质量。C语言经过编译之后将内存分为以下多少个区域:

(2)堆(heap):用于程序动态申请分配和刑释解教空间。C语言中的malloc和free,C++中的new和delete均是在堆中展开的。正常情状下,程序员申请的空间在行使完成后应该释放,若程序员没有自由空间,则程序停止时系统活动回收。注意:那里的“堆”并不是数据结构中的“堆”。

include <stdlib.h>

int k1 = 1;
int k2;
static int k3 = 2;
static int k4;
int main( )
{ staticint m1=2, m2;
inti=1;
charp;
charstr[10] = “hello”;
char
q = “hello”;
p= (char *)malloc( 100 );
free(p);
printf(“栈区-变量地址 i:%p\n”, &i);
printf(” p:%p\n”, &p);
printf(” str:%p\n”, str);
printf(” q:%p\n”, &q);
printf(“堆区地址-动态申请:%p\n”, p);
printf(“全局外部有初值 k1:%p\n”, &k1);
printf(” 外部无初值 k2:%p\n”, &k2);
printf(“静态外部有初值 k3:%p\n”, &k3);
printf(” 外静无初值 k4:%p\n”, &k4);
printf(” 内静态有初值 m1:%p\n”, &m1);
printf(” 内静态无初值 m2:%p\n”, &m2);
printf(“文字常量地址 :%p, %s\n”,q, q);
printf(“程序区地址 :%p\n”,&main);
return0;
}
更加多技术文章请关怀微信公众号:开点工作室(ID:kaidiancs)

有趣味的读者可以运行上边的先后,分析一下运行结果。

include <stdio.h>