收藏 分享(赏)

嵌入式C语言面试题大全(看这个就够了).pdf

上传人:weiwoduzun 文档编号:3154131 上传时间:2018-10-04 格式:PDF 页数:40 大小:508.41KB
下载 相关 举报
嵌入式C语言面试题大全(看这个就够了).pdf_第1页
第1页 / 共40页
嵌入式C语言面试题大全(看这个就够了).pdf_第2页
第2页 / 共40页
嵌入式C语言面试题大全(看这个就够了).pdf_第3页
第3页 / 共40页
嵌入式C语言面试题大全(看这个就够了).pdf_第4页
第4页 / 共40页
嵌入式C语言面试题大全(看这个就够了).pdf_第5页
第5页 / 共40页
点击查看更多>>
资源描述

1、 1.static有什么用途?(请至少说明两种) 1)限制变量的作用域 2)设置变量的存储域(堆,主动分配内存也是堆) 1)在函数体,一个被声明为静态的变量在这一函数被调用过程中维持其值不变。2) 在模块内(但在函数体外),一个被声明为静态的变量可以被模块内所用函数访问,但不能被模块外其它函数访问。它是一个本地的全局变量。3) 在模块内,一个被声明为静态的函数只可被这一模块内的其它函数调用。那就是,这个函数被限制在声明它的模块的本地范围内使用。 4.全局变量和局部变量在内存中 是否有区别?如果有,是什么区别? 全局变量储存在静态数据库,局部变量在栈 6.堆栈溢出一般是由什么原因导致的? 堆栈溢

2、出一般是循环的递归调用导致的,如果使用的大数据结构的局部变量,也可能导致堆栈溢出。 没有回收垃圾资源导致的是内存泄露最后内存耗尽。 20.不能做 switch()的参数类型是: switch的参数不能为实型。(只能是 int char) 9.写出 float x 与“零值”比较的 if语句。 if(x-0.000001) 3.在 c语言库函数 中将一个字符转换成整型的函数是 atol()吗,这个函数的原型是什么? 函数名 : atol 功能 : 把字符串转换成长整型数 函数的原型 : long atol(const char *nptr); 程序例 : #include #include in

3、t main(void) long l; char *str = “98765432“; l = atol(lstr); printf(“string = %s integer = %ldn“, str, l); return(0); 1.对于一个频繁使用的短小函数 ,在 C语言中应用什么实现 ,在 C+中应用什么实现 ? c用宏定义, c+用 inline 8.软件测试都有那些种类 ? 黑盒:针对系统功能的测试 白合:测试函数功能,各函数接口 9.确定模块的功能和模块的接口是在软件设计的那个阶段完成的 ? 概要设计阶段 11.unsignedchar *p1; unsigned long *

4、p2; p1=(unsigned char *)0x801000; p2=(unsigned long *)0x810000; 请问 p1+5=? ; p2+5=? ; 答: p1+5=0x801005 ; p2+5=0x810014 ; 1.请问下面程序有什么错误 ? int a602501000,i,j,k; for(k=0;k 4; while (-i); return c; 3、两个字符串, s,t;把 t字符串接到 s字符串尾, s字符串有足够的空间存放 t字符串 void connect(char *s, char *t, int i) char *q = t; char *p =

5、s; if(q =NULL)return; while(*p!=0) p+; while(*q!=0) *p=*q; p+; q+; *p = 0; void main() charp7=“ABC“; charp2=“EFG“; connect(p,p2,3); printf(“%s“,p); 4、分析下面的代码: char*a = “hello“; char*b = “hello“; if(a=b) printf(“YES“); else printf(“NO“); 常量字符 串。位于静态存储区,它在程序生命期内恒定不变。如果编译器优化的话,会有可能 a和 b同时指向同一个 hello的。则

6、地址相同。如果编译器没有优化,那么就是两个不同的地址,则不同。对 VC,是相同。 5、局部变量能否和全局变量重名? 答:能,局部会屏蔽全局。要用全局变量,需要使用 “:“ ;局部变量可以与全局变量同名,在函数内引用这个变量时,会用到同名的局部变量,而不会用到全局变量。对于有些编译器而言,在同一个函数内可以定义多个同名的局部变量,比如在两个循环体内都定义一个同名的局部变量,而那个局部变 量的作用域就在那个循环体内。 2、如何引用一个已经定义过的全局变量? 答: extern 例如在某个 .cpp中定义了一个全局变量 int a,可在头文件中加入extern a;然后在需要引用的文件中包含该头文件

7、。或者直接在文件中加入 externa; 3、全局变量可不可以定义在可被多个 .C文件包含的头文件中?为什么? 答:可以 在头文件中用 static来定义同名全局变量。 另外某个 .C文件中定义的非静态全局变量,可以在其头文件中用 extern声明,需引用此全局变量的其他 .C只需包含此头文件 即可。 4、请写出下列代码的输出内容 #include intmain(void) int a,b,c,d; a=10; b=a+; c=+a; d=10*a+; printf(“b, c, d: %d, %d, %d“, b, c, d) ; return 0; 答: 10, 12, 120 5、 s

8、tatic全局变量与普通的全局变量有什么区别? static局部变量和普通局部变量有什么区别? static函数与普 通函数有什么区别? 答 : 1) 全局变量 (外部变量 )的说明之前再冠以 static 就构成了静态的全局变量。全局变量本身就是静态存储方式, 静态全局变量当然也是静态存储方式。 这两者在存储方式上并无不同。 这两者的区别在于非静态全局变量的作用域是整个源程序,当一个源程序由多个源文件组成时,非静态的全局变量在各个源文件中都是有效的。 而静态全局变量则限制了其作用域, 即只在定义该变量的源文件内有效, 在同一源程序的其它源文件中不能使用它。由于静态全局变量的作用域局限于一个源

9、文件内,只能为该源文件内的函数公用 ,因此可以避免在其它源文件中引起错误。 2) 从以上分析可以看出, 把局部变量改变为静态变量后是改变了它的存储方式即改变了它的生存期。把全局变量改变为静态变量后是改变了它的作用域,限制了它的使用范围。 3) static函数与普通函数作用域不同 ,仅在本文件。只在当前源文件中使用的函数应该说明为内部函数 (static),内部函数应该在当前源文件中说明和定义。对于可在当前源文件以外使用的函数,应该在一个头文件中说明,要使用这些函数的源文件要包含这个头文件 综上所述 : static全局变量与普通的全局变量有什么区别: static全局变量只初使化一次,防止在

10、其他文件单元中被引用 ; static局部变量和普通局部变量有什么区别: static局部变量只被初始化一次,下一次依据上一次结果值; static函数与普通函数有什么区别: static函数在内存中只有一份,普通函数在每个被调用中维持一份拷贝 6、设有以下说明和定义: typedef union long i; int k5;/20 char c; DATE; struct data int cat; /4 DATE cow; /20 double dog;/8 too; DATE max; 则语句 printf(“%d“,sizeof(struct data)+sizeof(max);的执

11、行结果是: 考点 :区别 struct与 union.(一般假定在 32位机器上 ) 答: DATE是一个 union, 变量公用空间 .里面最大的变量类型是 int5, 占用 20个字节 . 所以它的大小是 20. data是一个 struct,每个变量分开占用 空间 . 依次为 int4 + DATE20 +double8 = 32. 所以结果是 20 + 32 = 52. 10、请找出下面代码中的所有错误 (题目不错 ,值得一看 ) 说明:以下代码是把一个字符串倒序,如“ abcd”倒序后变为“ dcba” #include“string.h“ main() char*src=“hell

12、o,world“; char* dest=NULL; int len=strlen(src); dest=(char*)malloc(len); char* d=dest; char* s=srclen; while(len-!=0) *d+=*s-; printf(“%s“,dest); return 0; 答: 方法 1:一共有 4个错误 ; int main() char* src = “hello,world“; int len = strlen(src); char* dest = (char*)malloc(len+1);/要为分配一个空间 char* d = dest; char

13、* s = /指向最后一个字符 while( len- != 0 ) *d+=*s-; *d = 0; /尾部要加 0 printf(“%sn“,dest); free(dest); / 使用完,应当释放空间,以免造成内存汇泄露 dest = NULL; /防止产生野指针 return 0; 方法 2: (方法一需要额外的存储空间 ,效率不高 .) 不错的想法 #include #include main() charstr=“hello,world“; intlen=strlen(str); char t; for(int i=0;i #include “iostream.h“ void U

14、pperCase( char str ) / 将 str 中的小写字母转换成大写字母 int i; for( i=0;i #include voidgetmemory(char *p) /函数的参数是局部变量,在这里给它分配内存还在,但是 P释放了。 p=(char *) malloc(100); intmain( ) char *str=NULL; getmemory(str); strcpy(str,“helloworld“); printf(“%s/n“,str); free(str); return 0; 答 : 程序崩溃, getmemory中的 malloc不能返回动态内存, fr

15、ee()对 str操作很危险 解决方案 1:可改为按引用传递: void getmemory(char * return p; 5.charszstr10; strcpy(szstr,“0123456789“); 产生什么结果?为什么? 答 ;正常输出 ,长度不一样,会造成非法的 OS,覆盖别的内容 . 0没保存 2.c指针 int *pn;-指针数组,每个元素均为指向整型数据的指针。 int (*p)n;-p为指向一维数组的指针,这个一维数组有 n个整型数据。 int *p();-函数带返回指针,指针指向返回的值。 int (*p)();-p为指向函数的指针。 3. 数组越界问题 (这个题目

16、还是有点小险的 ) 下面这个程序执行后会有什么错误或者效果 : #defineMAX 255 intmain() unsignedchar AMAX,i; for (i=0;i 功能:把 src所指由 NULL结束的字符串复制到 dest所指的数组中。 说明 : src和 dest所指内存区域不可以重叠且 dest必须有足够的空间来容纳 src的字符串。 返回指向 dest的指针。 memcpy原型: void *memcpy_su(void *dest, void *src, unsigned int count) assert(dest!=NULL) char*bdest = (char*

17、)dest; char* bsrc =(char*) src; while(count0) *bdest+ = *bsrc+; return dest; 用法: #include 功能:由 src所指内存区域复制 count个字节到 dest所指内存区域。 说明: src和 dest所指内存区域不能重叠,函数返回指向 dest的指针。 Memset原型: 原型: extern void *memset(void *buffer, char c, int count); 用法: #include 功能:把 buffer所指内存区域的前 count个字节设置成字符 c。 说明:返回指向 buffe

18、r的指针。 void *memset_su(void*buffer, int c, int count) assert (buffer!=NULL); char* buffer2 =(char*)buffer; while(count0) *buffer2+ = c; return buffer; 5.ASSERT()是干什么用的 答 :ASSERT()是一个调试程序时经常使用的宏,在程序运行时它计算括号内的表达式,如 果表达式为 FALSE (0), 程序将报告错误,并终止执行。如果表达式不为 0,则继续执行后面的语句。这个宏通常用来判断程序中是否出现了明显非法的数据,如果出现了终止程序以免

19、导致严重后果,同时也便于查找错误。例如,变量 n在程序中不应该为 0,如果为 0可能导致错误,你可以这样写程序: ASSERT( n != 0); k = 10/ n; ASSERT只有在 Debug版本中才有效,如果编译为 Release版本则被忽略。 assert()的功能类似,它是 ANSI C标准中规定的函数,它与 ASSERT的一个重要区别是可以用在 Release版本中。 #include #include void main() intn=1; assert( n != 0); /c c+中使用 /ASSERT( n != 0); /什么头文件 ? printf(“sun“);

20、1. 编写用 C语言实现的求 n阶阶乘问题的 递归算 法: 答 :long int fact(int n) If(n=0|n=1) Return 1; Else Return n*fact(n-1); 5. 冒泡排序: #include “stdio.h“ void printArr(int R,int n) inti; for(i=0;iRj+1) /大的往下沉 swap( */ for(intj=n-1;ji;j-) / / 每次需要比较的次数 if(RjRj-1) /小的往上冒 swap( void main() int i; intnum6=0; printf(“Pleaseinput

21、 6 numbers:n“); for(i=0;i6;i+) scanf(“%d“, puts(“beforesort:“); printArr(num,6); maopaoSort(num,6); puts(“aftersort:“); printArr(num,6); 试题 8:再看看下面的一段程序有什么错误: swap(int* p1,int* p2 ) int *p; *p = *p1; *p1 = *p2; *p2 = *p; 在 swap函数中, p是一个“野”指针,有可能指向系统区,导致程序运行的崩溃。在 VC+中 DEBUG运行时提示错误“ Access Violation”。该程序应该改为: swap( int* p1,int* p2 ) int p; p = *p1; *p1 = *p2; *p2 = p; 试题 1:分别给出 BOOL, int, float,指针变量 与“零值”比较的 if 语句(假设变量名为 var) 解答: BOOL型变量: if(!var)

展开阅读全文
相关资源
猜你喜欢
相关搜索
资源标签

当前位置:首页 > 中等教育 > 试题课件

本站链接:文库   一言   我酷   合作


客服QQ:2549714901微博号:道客多多官方知乎号:道客多多

经营许可证编号: 粤ICP备2021046453号世界地图

道客多多©版权所有2020-2025营业执照举报