嵌入式笔试题
嵌入式软件工程师笔试题(含答案)

嵌入式软件工程师笔试题(含答案).txt26选择自信,就是选择豁达坦然,就是选择在名利面前岿然不动,就是选择在势力面前昂首挺胸,撑开自信的帆破流向前,展示搏击的风采。
选择题1:设float a=2, b=4, c=3;,以下C语言表达式与代数式 (a+b)+c计算结果不一致的是A.(a+b)*c/2B.(1/2)*(a+b)*cC.(a+b)*c*1/2D.c/2*(a+b)参考答案:B,因为a,b,c三个变量都是浮点数,所以在B答案中其结果是0,因为在计算1/2是就是0,如果改成1/2.0就正确了。
2:为了向二进制文件尾部增加数据,打开文件的方式应采用A.″ab″B.″rb+″C.″wb″D.″wb+″参考答案:D3:下述程序执行后的输出结果是#includemain(){int x='f';printf("%c\n",'a'+(x-'a'+1));}A.gB.hC.iD.j参考答案:A4:C语言中,下列运算符优先级最高的是A.!B.%C.>>D.==参考答案:A5:数组定义为“ int a [ 4 ] ; ”,表达式 ( ) 是错误的。
A.*aB.a [ 0 ]C.aD.a++参考答案:D6:执行语句“ k=7>>1; ”后,变量 k 的当前值是A.15B.31C.3D.1参考答案:C7:定义函数时,缺省函数的类型声明,则函数类型取缺省类型A.voidB.charC.floatD.int参考答案:D8:若main()函数带参数,参数个数最多是A.0B.1C.2D.3参考答案:C 只知道有定义形式main(int argc,char* argv[]))9:若有宏定义:#define MOD(x,y) x%y则执行以下语句后的输出结果是int a=13,b=94;printf(″%d\n″,MOD(b,a+4));A.5B.7C.9D.11参考答案:B10:下列各个错误中,哪一个不属于编译错误A.改变 x 原值 3 为 5 ,写作“ x==5 ;”B.花括号不配对C.复合语句中的最后一条语句后未加分号D.变量有引用、无定义参考答案:A11:下列程序段运行后, x 的值是( )a=1;b=2;x=0;if(!( -- a))x -- ;if(!b)x=7;else ++x;A.0B.3C.6D.7参考答案:A12:设#define N 3#define Y(n) ((N+1)*n)则表达式2*(N+Y(5+1))的值是A.42B.48C.54D.出错参考答案:B Y(5+1) 传递过去的应该是6,而不是简单的把5+1给替换掉13:若定义了char ch[]={″abc\0def″},*p=ch;则执行printf(″%c″,*p+4);语句的输出结果是A.defB.dC.eD.0参考答案:C14:下列转义字符中错误的是A.′\000′B.′\14′C.′\x111′D.′\2′参考答案:C error C2022: '273' : too big for character15:算术运算符,赋值运算符和关系运算符的运算优先级按从高到低依次为A.算术运算、赋值运算、关系运算B.算术运算、关系运算、赋值运算C.关系运算、赋值运算、算术运算D.关系运算、算术运算、赋值运算参考答案:B16:设#define N 3#define Y(n) ((N+1)*n)则表达式2*(N+Y(5+1))的值是A.42B.48C.54D.出错参考答案:B17:表达式 strcmp( “ 3.14 ”,“ 3.278 ” ) 的值是一个A.非零整数B.浮点数C.0D.字符参考答案: A18:设struct{ short a;char b;float c;}cs;则sizeof(cs)的值是A.4B.5C.6D.7参考答案: D 字节对齐的话应该是819:若变量已正确定义,表达式( j=3 , j++ )的值是A.3B.4C.5D.0参考答案:A20:C 语言中运算对象必须是整型的运算符是A.%B./C.!D.**参考答案:A简答题21:打印一个N*N的方阵,N为每边字符的个数( 3〈N〈20 ),要求最外层为“X”,第二层为“Y”,从第三层起每层依次打印数字0,1,2,3,...例子:当N =5,打印出下面的图形:X X X X XX Y Y Y XX Y 0 Y XX Y Y Y XX X X X X22:谈谈COM的线程模型。
CVTE(广州视源)嵌入式笔试题目

CVTE(广州视源)嵌入式笔试题目
1、编写程序,统计输入的一行字符串中字母,数字,空格,和其他的字符的数目。
2、一个数可以有一个数的平方求得,则这个数被称为完全平方数,现在一个数加上100后是一个完全平方数,加上168后也是一个完全平方数,请写代码求出这个数。
3、写程序判断一个二叉树的节点中,有两个父节点的节点,找出这样的节点。
树的结构为:
structnode{
node*plft;
node*pright;
intdata;
}
4、文件系统类型有哪些?
fat16文件系统.fat32文件系统,ntfs文件系统,cdfs文件系统,linux 文件系统.raw文件系统.unix文件系统.jfs文件系统
5、有100个球场,然后又不同单位来定,可以定多个场地,但是所定场号需要连续,被定的场地不能重复使用,当单位退场需回收场地,请设计一个完整系统进行管理。
(考虑球场利用率)。
嵌入式面试笔试题目——附部分答案

嵌⼊式⾯试笔试题⽬——附部分答案1 、如何⾃动创建设备⽂件?class_create device_create2、led驱动编写有⼏种⽅式?输⼊⼦系统字符设备驱动总线platform led⼦系统3、如何实现http服务器?tcp服务器:socket4、如何编写守护进程,简述syslog的作⽤?第⼀步:创建进程、杀死⽗进程第⼆步:创建新的会话第三步:改变⼯作路径路径第四步:修改⽂件掩码权限第五步:关闭⽂件描述符5、bootloader和uboot的区别?bootloader是启动装载。
这是⼀段很⼩的程序,⽤于在系统上电启动初期运⾏,初始化关键接⼝,如内存,串⼝,关闭中断,关闭看门狗,引导系统进⼊内核的⼀段初始化的程序。
它主要任务就是将内核映像从硬盘读到RAM中,然后跳转到内核的⼊⼝点去运⾏内核,从⽽建⽴系统运⾏的必要环境。
uboot:是bootloader的⼀种6、如何移植uboot?1、下载源码2、解压uboot源码并进⼊⽬录3、指定交叉编译⼯具链4、指定产品BOARD 底板5、编译u-boot7、传感器驱动如何编写?8、BL0,BL1,BL2,BL3的作⽤?BL0 ⽂件是存放在 CPU 内部 IROM 中的⼀段固化代码,CPU 上点之后,⾸先去运⾏soc中的BL0,运⾏时会将 BL1 拷贝到 CPU 的 IRAM 中,然后执⾏BL1;BL1⽂件执⾏起来之后会先进⾏内存的初始化,之后将 BL2 ⽂件拷贝到外部内存中,BL2会初始化BL3的运⾏环境,将BL3搬移到DRAM中,BL3会有⼀个⾃搬移的过程,从⽽启动内核⼊⼝。
BL0:CPU内部的固化代码BL1:三星提供的加密⽂件BL2:截取uboot.bin 前14kBL3:剩下的uboot 执⾏命令以及加载引导内核9、exynos4412 时钟 APLL,MPLL,VPLL的区别?------倍频锁相环APLL:⽤于 CPU_BLK (可产⽣⾼达1.4GHz的频率);作为 MPLL 的补充,它也可以给DMC_BLK 、LEFTBUS_BLK 、RIGHTBUS_BLK 和 CMU_TOP 提供时钟。
信捷电气嵌入式笔试题目

信捷电气嵌入式笔试题目
哎,说起这信捷电气的嵌入式笔试题目,那可真不是盖的!我昨儿个去试了试水,发现这题目嘛,就跟咱们四川的火锅一样,辣得你直吸气,但又让人停不下来。
咱们四川人嘛,都喜欢说“辣得安逸”,这题目也是这样,难得安逸。
不过话说回来,咱们陕西的老乡也有句话叫“难者不会,会者不难”,看来要想拿下这题目,还得靠真才实学啊。
然后说说咱们北京的老少爷们儿,那讲究一个“稳扎稳打”。
这嵌入式笔试题目,也是得一步一步来,不能急躁。
你得先理解题意,再找准思路,最后才能下笔如有神。
咱就说其中一道题目吧,是关于嵌入式系统中断处理的。
这题目嘛,就像咱们四川的串串香,看似简单,但要想串得好吃,还得靠技巧。
你得知道哪些中断是优先级高的,哪些是要先处理的,还得考虑中断嵌套和中断屏蔽的问题。
再说说陕西方言里的那种“实在劲儿”,在嵌入式系统里,就是要实事求是,不能弄虚作假。
中断处理也是这样,你得根据实际情况来编程,不能想当然。
最后说说咱们北京的“大气”。
在嵌入式系统设计中,有时候得有大局观,不能只看到眼前的中断处理,还得考虑整个系统的稳定性和效率。
这就像北京的故宫,虽然每个宫殿都有自己的特色,但整体看起来却是和谐统一的。
所以说啊,这信捷电气的嵌入式笔试题目,虽然难,但也有它的乐趣。
只
要你用心去琢磨,总能找到解题的窍门。
就像咱们四川的火锅、陕西的面食、北京的烤鸭一样,各有各的特色,但都得用心去品味才能尝出其中的滋味。
科大讯飞嵌入式笔试题目

科大讯飞嵌入式笔试题目
科大讯飞的嵌入式笔试题目可能因岗位和时间而有所不同。
以下题目仅供参考:
1. 定义一个n*m矩阵,找到两个不在同一行同一列的数字,使得成绩最大。
2. 有一组数据,要求实现一个函数,将数据按照从小到大的顺序进行排序。
3. 写出一个函数,用于实现一个数组的冒泡排序。
4. 嵌入式系统中,常用的操作系统有哪些?请简要说明其特点。
5. 在嵌入式系统中,如何进行内存管理?请简要说明其原理。
6. 在嵌入式系统中,如何进行任务调度?请简要说明其原理。
7. 在嵌入式系统中,如何进行中断处理?请简要说明其原理。
8. 在嵌入式系统中,如何进行设备驱动程序的开发?请简要说明其原理。
9. 在嵌入式系统中,如何进行系统移植?请简要说明其原理。
10. 在嵌入式系统中,如何进行网络通信?请简要说明其原理。
以上题目仅供参考,具体考试内容可能因岗位和时间而有所不同。
建议查看科大讯飞的招聘网站或咨询相关人员获取更准确的信息。
(完整版)嵌入式Linux笔试题库和答案(新)

嵌入式Linux笔试题库一.选择题1.Linux的创始人是谁()A、TurbolinuxB、A T&T Bell LaboratryC、University of HelsinkiD、Linus Torvalds2.在Linux中,命令解释器是哪个()A、管道B、分级文件系统C、字符型处理器D、shell3.Linux安装程序提供了两个引导装载程序( )A、GROUP和LLTOB、DIR和COIDC、GRUB和LILOD、以上都不是4.如果当前目录是/home/sea/china,那么“china”的父目录是哪个目录()A、/home/seaB、/home/C、/D、/sea5.在Linux中,要删除abc目录及其全部内容的命令为:()A、rm abcB、rm -r abcC、rmdir abcD、rmdir -r abc6.假定kernel支持vfat分区,下面哪一个操作是将/dev/hda1分区加载到/win目录?()A、mount -t windows /win /dev/hda1B、mount -fs=msdos /dev/hda1 /winC、mount -s win /dev/hda1 /winD、mount –t vfat /dev/hda1 /win7.显示用户的主目录的命令是什么()A、echo $HOMEB、echo $USERDIRC、echo $ECHOD、echo $ENV8.系统中有用户user1和user2,同属于users组。
在user1用户目录下有一文件file1,它拥有644的权限,如果user2用户想修改user1用户目录下的file1文件,应拥有( )权限。
A、744B、664C、646D、7469.如何查看一个RPM软件包是否安装( )A、rpm -Vc postfixB、rpm -q postfixC、rpm --changelog postfixD、rpm -q—changelog postfix10*.在Linux中,提供TCP/IP包过滤功能的软件叫什么( C )A、rarpB、routeC、iptablesD、filter11.nfs服务的配置文件是什么?()/etc/mtab B、/etc/fastboot C、/etc/fstab D、/etc/exports12.用命令ls -al显示出文件ff的描述:-rwxr-xr-- 1 root root 599 Cec 10 17:12 ff 由此可知文件ff的类型为:()A、普通文件B、硬连接C、目录D符号连接13.Linux操作系统中的shell是()A、命令解释器B、程序设计语言C、脚本编辑器D、编译器14.能实现文件系统远程挂载的是()。
嵌入式工程师笔试题目
嵌入式工程师笔试题目嵌入式工程师笔试题目嵌入式工程师是指具有C/C++语言、汇编语言等基础,熟悉模拟电子技术等硬件知识,了解处理器体系结构,做嵌入式系统设计和开发,包括硬件系统的建立和相关软件开发、移植、调试等工作的人,下面就是整理的嵌入式工程师笔试题目,请看:嵌入式工程师笔试题目【1】1、一根金条长31厘米,如果把它切成数段,使其中的一段或几段能够接成长为1到31中任何整数的金条,请问要切几次?A.4B.5C.6D.7参考答案:A2、运行在多核处理器上的Linux环境中,若临界区非常短,且不允许线程上下文切换的情况下,使用下列哪种机制满足上述需求并且性能最好?A.SpinLockB.MutexC.SemaphoreD.Condition variable参考答案:A3、以下程序输出的结果是()#includeint main(){int x=10,y=10;printf("%d %d",x--,--y);}A.10 10B.9 9C.9 10D.10 9参考答案:D4、下面所述步骤中,不是创建进程所必须的步骤是?A.由调度程序为进程分配CPUB.建立一个进程控制块C.为进程分配内存D.将进程控制块链入就绪队列参考答案:A5、下面描述中,表达正确的有()A.公有继承是基类中的public成员在派生类中仍是public的B.公有继承是基类中的'private成员在派生类中仍是private的C.公有继承是基类中的protected成员在派生类中仍是protected的D.私有继承是基类中的public成员在派生类中仍是private的参考答案:ACD6、int listen(SOCKET s, int backlog);该函数中第二个参数的含义是?A.是否打开log信息B.是否打开后台log信息C.后台等待连接队列的最大限制值D.后台等待连接队列的最小限制值参考答案:C7、Java程序中的类名称必须与存放该类的文件名相同。
嵌入式C语言笔试题及答案
嵌入式C语言笔试题及答案嵌入式C语言笔试题及答案为关怀同学们深入学习嵌入式C语言学习,yjbys我为大家共享最新的嵌入式C语言笔试题及答案,希望对大家有所关怀!预处理器(Preprocessor)1. 用预处理指令#define 声明一个常数,用以说明1年中有多少秒(忽视闰年问题)#define SECONDS_PER_YEAR (60 * 60 * 24 * 365)UL 我在这想看到几件事情:1). #define 语法的基本学问(例如:不能以分号结束,括号的使用,等等)2). 懂得预处理器将为你计算常数表达式的值,因此,直接写出你是如何计算一年中有多少秒而不是计算出实际的值,是更清晰而没有代价的。
3). 意识到这个表达式将使一个16位机的整型数溢出-因此要用到长整型符号L,告知编译器这个常数是的长整型数。
4). 假如你在你的表达式中用到UL(表示无符号长整型),那么你有了一个好的起点。
记住,第一印象很重要。
2. 写一个"标准'宏MIN,这个宏输入两个参数并返回较小的一个。
#define MIN(A,B) ((A) = (B) ?(A) :(B))这个测试是为下面的目的而设的:1). 标识#define在宏中应用的基本学问。
这是很重要的,因为直到嵌入(inline)操作符变为标准C的一部分,宏是方便产生嵌入代码的唯一方法,对于嵌入式系统来说,为了能到达要求的性能,嵌入代码经常是必需的方法。
2). 三重条件操作符的学问。
这个操作符存在C语言中的缘由是它使得编译器能产生比if-then-else更优化的代码,了解这个用法是很重要的。
3). 懂得在宏中留神地把参数用括号括起来4). 我也用这个问题开始商议宏的副作用,例如:当你写下面的代码时会发生什么事?least = MIN(*p++, b);3. 预处理器标识#error的目的是什么?#error预处理指令的作用是,编译程序时,只要遇到#error就会生成一个编译错误提示消息,并停止编译。
海康威视嵌入式软件开发工程师(BSP)笔试题(附超详细解答)
1、若有8个待排序元素,采用冒泡排序和插入排序最大时间复杂度分别是()。
64、2464、6416、6416、16KEY:B解答:9大内部排序的时间复杂度和空间复杂度如下表所示:O() O()O() O()O() O() O() O()O() O()O() O()O() O() O()O() O() O()O() O() O()1.int a[15] = { 1,2,3,4,5,6,7,8,9,10,11,12,13,14,15 };2.int *p = &a[5];3.int b = p[7];14131112KEY:B3、下列代码中数组data最终的数据是哪个()。
1.#define MAX_DATA_SIZE (10)2.3.int main()4.{5.unsigned int i = 0;6.unsigned char data[MAX_DATA_SIZE] = { 1,2,3,4,5,6,7,8,9,0 };7.8.memcpy(&data[2], data, MAX_DATA_SIZE / 2);9.10.return 0;11.}123456789012121218901212345890其他结果都不对KEY:D解答:由于本题中data数组里直接放的是数字,直接强制转化为char类型,按照ASCII码进行查询,显然不会是这些数字了。
也就是说,如果改成以下的定义:unsigned char data[MAX_DATA_SIZE] ={ '1','2','3','4','5','6','7','8','9','0' };那么答案就是C了。
4、下面哪个命令用来卸载一个内核模块?modprobedelmodunmodrmmodKEY:D5、使用快速排序对n个数进行排序,其在最佳情况、平均情况、最差情况下的时间复杂度分别是()。
嵌入式Linux笔试题库和答案xin
嵌入式Linux笔试题库和答案xin第一篇:嵌入式Linux笔试题库和答案xin嵌入式Linux笔试题库一.选择题1.Linux的创始人是谁(D)A、TurbolinuxB、AT&T Bell LaboratryC、University of HelsinkiD、Linus T orvalds 2.在Linux中,命令解释器是哪个(D)A、管道B、分级文件系统C、字符型处理器D、shell 3.Linux安装程序提供了两个引导装载程序(C)A、GROUP和LLTOB、DIR和COIDC、GRUB和LILOD、以上都不是4.如果当前目录是/home/sea/china,那么“china”的父目录是哪个目录(A)A、/home/sea B、/home/C、/D、/sea 5.在Linux中,要删除abc目录及其全部内容的命令为:(B)A、rm abc B、rm-r abc C、rmdir abcD、rmdir-r abc 6.假定kernel支持vfat分区,下面哪一个操作是将/dev/hda1分区加载到/win目录?(D)A、mount-t windows /win/dev/hda1 B、mount-fs=msdos/dev/hda1/win C、mount-swin/dev/hda1 /win D、mount –t vfat/dev/hda1 /win 7.显示用户的主目录的命令是什么(A)A、echo $HOMEB、echo $USERDIRC、echo $ECHOD、echo $ENV 8.系统中有用户user1和user2,同属于users组。
在user1用户目录下有一文件file1,它拥有644的权限,如果user2用户想修改user1用户目录下的file1文件,应拥有()权限。
A、744B、664C、646D、746 9.如何查看一个RPM软件包是否安装(B)A、rpm-VcpostfixB、rpm-qpostfixC、rpm--changelogpostfixD、rpm-qchangelogpostfix10.nfs服务的配置文件是什么?()/etc/mtab B、/etc/fastboot C、/etc/fstab D、/etc/exports 11.用命令ls-al显示出文件ff的描述:-rwxr-xr--1 root root 599 Cec 10 17:12 ff 由此可知文件ff的类型为:(A)A、普通文件B、硬连接C、目录D符号连接13.Linux操作系统中的shell是(A)A、命令解释器B、程序设计语言C、脚本编辑器D、编译器14.能实现文件系统远程挂载的是(B)。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
第一章C语言常见问题1.1关作键字static的用这个简单的问题很少有人能回答完全。
在C语言中,关键字static有三个明显的作用:1)在函数体内,一个被声明为静态的变量在这一函数被调用过程中维持其值不变(该变量存放在静态变量区)。
2)在模块内(但在函数体外),一个被声明为静态的变量可以被模块内所用函数访问,但不能被模块外其它函数访问。
它是一个本地的全局变量。
3)在模块内,一个被声明为静态的函数只可被这一模块内的其它函数调用。
那就是,这个函数被限制在声明它的模块的本地范围内使用。
大多数应试者能正确回答第一部分,一部分能正确回答第二部分,但是很少的人能懂得第三部分。
这是一个应试者的严重的缺点,因为他显然不懂得本地化数据和代码范围的好处和重要性。
考点:在嵌入式系统中,要时刻懂得移植的重要性,程序可能是很多程序员共同协作同时完成,在定义变量及函数的过程,可能会重名,这给系统的集成带来麻烦,因此保证不冲突的办法是显示的表示此变量或者函数是本地的,static即可。
在Linux的模块编程中,这一条很明显,所有的函数和全局变量都要用static 关键字声明,将其作用域限制在本模块内部,与其他模块共享的函数或者变量要EXPORT到内核中。
1)设置变量的存储域,函数体内static变量的作用范围为该函数体,不同于auto 变量,该变量的内存只被分配一次,因此其值在下次调用时仍维持上次的值;(2)限制变量的作用域,在模块内的static全局变量可以被模块内所用函数访问,但不能被模块外其它函数访问;(3)限制函数的作用域,在模块内的static函数只可被这一模块内的其它函数调用,这个函数的使用范围被限制在声明它的模块内;(4)在类中的static成员变量意味着它为该类的所有实例所共享,也就是说当某个类的实例修改了该静态成员变量,其修改值为该类的其它所有实例所见;(5)在类中的static成员函数属于整个类所拥有,这个函数不接收this指针,因而只能访问类的static成员变量。
1.2程序运行时的内存分配一个由C/C++编译的程序占用的内存分为以下几个部分1、栈区(stack)—由编译器自动分配释放,存放函数的参数值,局部变量的值等。
其操作方式类似于数据结构中的栈。
2、堆区(heap)—一般由程序员分配释放,若程序员不释放,程序结束时可能由OS回收。
注意它与数据结构中的堆是两回事,分配方式类似于链表。
3、全局区(静态区)(static)—全局变量和静态变量的存储是放在一块的,初始化的全局变量和静态变量在一块区域,未初始化的全局变量和未初始化的静态变量在相邻的另一块区域。
- 程序结束后由系统释放。
4、文字常量区—常量字符串就是放在这里的。
程序结束后由系统释放5、程序代码区—存放函数体的二进制代码。
二、例子程序这是一个前辈写的,非常详细//main.cppint a = 0;全局初始化区char *p1;全局未初始化区main(){int b;栈char s[] ="abc";栈char *p2;栈char *p3 ="123456"; 123456\0在常量区,p3在栈上。
static int c =0;全局(静态)初始化区p1 = (char*)malloc(10);p2 = (char*)malloc(20);分配得来得10和20字节的区域就在堆区。
strcpy(p1,"123456"); 123456\0放在常量区,编译器可能会将它与p3所指向的"123456"优化成一个地方。
}1.3堆和栈的区别1)申请方式stack:由系统自动分配。
例如,声明在函数中一个局部变量int b;系统自动在栈中为b 开辟空间heap:需要程序员自己申请,并指明大小,在c中malloc函数如p1 = (char *)malloc(10);在C++中用new运算符如p2 = (char *)malloc(10);但是注意p1、p2本身是在栈中的。
堆是向上增长而栈是向下增长2)堆栈的进一步讨论/kkxgx/article/details/7520902在学习《深入理解计算机系统》中链接这一章中,数据讲一个可执行文件包含多个段。
在Linux系统中代码段总是从0x08048000处开始,数据段在接下来的4KB对齐的地址处,运行时堆在接下来的读写段之后的第一个4KB对齐的地址处,并通过调用malloc库网上增长,开始于地址0x40000000处的段是为共享库保留的,用户栈总是从地址0xbfffffff处开始,并向下增长,从栈的上部开始于地址0xc0000000处的段是为操作系统驻留存储器部分的代码和数据保留的。
如下图:下面通过代码来测试:#include<stdio.h>int a1=0;staticintsa=0;int a2=0;int b;int main(){int c1=1;int c2;int *d=(int *)malloc(sizeof(int)*10); int *e=(int *)malloc(sizeof(int)*10); staticint f=0;if(d==NULL){printf("malloc error");return -1;}printf("a1:%p\n",&a1);printf("sa:%p\n",&sa);printf("a2:%p\n",&a2);printf("b:%p\n",&b);printf("c1:%p\n",&c1);printf("c2:%p\n",&c2);printf("d:%p\n",&d);printf("*d:%p\n",d);printf("e:%p\n",&e);printf("*e:%p\n",e);printf("f:%p\n",&f);printf("%p\n",&"123");free(d);return 0;}分析如下:a1,a2,sa,f是按序存放,且全局共有非静态变量和静态变量是分开存放的,紧接着存放的是全局非初始化变量b,由于是int型,故地址相差4.c1,c2,d,e这几个变量存储在用户栈空间。
主要区分d、e和d、e申请内存之间的区别。
*d,*e代表申请的内存,地址是增大方向,即地址是向上增长的,为堆中申请的数据。
“123”为常量,地址0x80486da应该在只读段的范围内,属于rodate数据。
故可知:C程序中,全局变量和静态变量存储在读写段,常量存储在制度段,动态申请的内容是在堆上,局部变量在运行时栈中。
1.4关键字const的含义只要能说出const意味着"只读"就可以了。
尽管这个答案不是完全的答案,但我接受它作为一个正确的答案。
(如果你想知道更详细的答案,仔细读一下Saks 的文章吧。
)如果应试者能正确回答这个问题,我将问他一个附加的问题:下面的声明都是什么意思?Const只是一个修饰符,不管怎么样a仍然是一个int型的变量constint a;intconst a;constint *a;int * const a;intconst * aconst;本质:const在谁后面谁就不可修改,const在最前面则将其后移一位即可,二者等效前两个的作用是一样,a是一个常整型数。
第三个意味着a是一个指向常整型数的指针(也就是,指向的整型数是不可修改的,但指针可以,此最常见于函数的参数,当你只引用传进来指针所指向的值时应该加上const修饰符,程序中修改编译就不通过,可以减少程序的bug)。
第四个意思a是一个指向整型数的常指针(也就是说,指针指向的整型数是可以修改的,但指针是不可修改的)。
最后一个意味着a是一个指向常整型数的常指针(也就是说,指针指向的整型数是不可修改的,同时指针也是不可修改的)。
const关键字至少有下列n个作用:(1)欲阻止一个变量被改变,可以使用const关键字。
在定义该const变量时,通常需要对它进行初始化,因为以后就没有机会再去改变它了;(2)对指针来说,可以指定指针本身为const,也可以指定指针所指的数据为const,或二者同时指定为const;(3)在一个函数声明中,const可以修饰形参,表明它是一个输入参数,在函数内部不能改变其值;(4)对于类的成员函数,若指定其为const类型,则表明其是一个常函数,不能修改类的成员变量;(5)对于类的成员函数,有时候必须指定其返回值为const类型,以使得其返回值不为“左值”。
例如:constclassAoperator*(constclassA& a1,const classA& a2);operator*的返回结果必须是一个const对象。
如果不是,这样的变态代码也不会编译出错:classA a, b, c;(a * b) = c; //对a*b的结果赋值操作(a * b) = c显然不符合编程者的初衷,也没有任何意义。
1.5关键字volatile含义一个定义为volatile的变量是说这变量可能会被意想不到地改变,这样,编译器就不会去假设这个变量的值了。
精确地说就是,优化器在用到这个变量时必须每次都小心地重新读取这个变量的值,而不是使用保存在寄存器里的备份。
下面是volatile变量的几个例子:1.6什么是野指针?产生的原因?“野指针”不是NULL指针,是指向“垃圾”内存(不可用内存)的指针。
“野指针”是很危险的,if无法判断一个指针是正常指针还是“野指针”。
有个良好的编程习惯是避免“野指针”的唯一方法。
野指针的成因主要有三种:一、指针变量没有被初始化。
指针变量在创建的同时应当被初始化,要么将指针设置为NULL,要么让它指向合法的内存。
二、指针p被free或者delete之后,没有置为NULL,让人误以为p是个合法的指针。
三、指针操作超越了变量的作用范围。
比如不要返回指向栈内存的指针或引用,因为栈内存在函数结束时会被释放。
比如说某个地址的生命期,使用一个没有生命期的指针是非常危险的。
1.7 sizeof和strlen区别一、sizeofsizeof(...)是运算符,在头文件中typedef为unsigned int,其值在编译时即计算好了,参数可以是数组、指针、类型、对象、函数等。