100条经典C语言笔试题目
1、请填写 bool , float, 指针变量 与“零值”比较的 if 语句。
提示:这里“零值”可以是 0, 0.0 , FALSE 或者“空指针” 。例如 int 变量 n 与“零值”
比较的 if 语句为: if ( n == 0 ) if ( n != 0 ) 以此类推。
(1)请写出 bool flag 与“零值”比较的 if 语句: 【标准答案】if ( flag ) if ( !flag )
(2)请写出 float x 与“零值”比较的 if 语句:
【标准答案】 const float EPSINON = 0.00001; if ((x >= -
EPSINON) && (x <= EPSINON) 不可将浮点变量用“==”或“!=”与数字比较,应该设法转化成“>=”或“<=”此类形式。 (3)请写出 char *p 与“零值”比较的 if 语句 【标准答案】 if (p == NULL) if (p != NULL)
2、以下为 Linux下的 32 位 C程序,请计算 sizeof 的值。 char str[] = “Hello” ; char *p =
str ; int n = 10; 请计算 (1)sizeof (str ) = (2)sizeof ( p ) = (3)sizeof ( n ) = 【标准答案】(1)6、(2)4、(3)4
(4)void Func ( char str[100]) { …… ;
} 请计算 sizeof( str ) = (5)void *p = malloc( 100 ); 请计算sizeof ( p ) =
【标准答案】(4)4、(5)4 3、 long a=0x801010; a+5=?
【标准答案】0x801010用二进制表示为:“1000 0000 0001 0000 0001 0000”,十进制的值
为8392720,再加上5就是8392725。 4、用变量a给出下面的定义
e) 一个有10个指针的数组,该指针是指向一个整型数的; f) 一个指向有10个整型数数组的指针 ;
g) 一个指向函数的指针,该函数有一个整型参数并返 回一个整型数;
h) 一个有10个指针的数组,该指针指向一个函数,该 函数有一个整型参数并返回一
个整型数;
【标准答案】e)int * a[10]; f)int (*a)[10]
g)int (*a)(int); h) int (*a[10])(int) 5、设有以下说明和定义:
typedef union {long i; int k[5]; char c;} DATE; struct data { int cat; DATE cow; double dog;} too; DATE max;
则语句 printf(\的执行结果是:_____
【标准答案】DATE是一个union, 变量公用空间. 里面最大的变量类型是int[5], 占用20个字
节. 所以它的大小是20
data是一个struct, 每个变量分开占用空间. 依次为int4 + DATE20 + double8 = 32. 所以结果是 20 + 32 = 52.
当然...在某些16位编辑器下, int可能是2字节,那么结果是 int2 + DATE10 + double8 = 20
6、请问以下代码有什么问题: int main() { char a; char *str=&a; strcpy(str,\ printf(str); return 0; }
【标准答案】没有为str分配内存空间,将会发生异常
问题出在将一个字符串复制进一个字符变量指针所指地址。虽然可以正确输出结果,但因为越界进行内在读写而导致程序崩溃。
7、请问以下代码有什么问题: char* s=\printf(\s[0]='B';
printf(\有什么错?
【标准答案】\是字符串常量。s是指针,指向这个字符串常量,所以声明s的时候就有
问题。
cosnt char* s=\
然后又因为是常量,所以对是s[0]的赋值操作是不合法的。 8、 int (*s[10])(int) 表示的是什么啊
【标准答案】int (*s[10])(int) 函数指针数组,每个指针指向一个int func(int param)的函数。 9、 c和c++中的struct有什么不同? 【标准答案】c和c++中struct的主要区别是c中的struct不可以含有成员函数,而c++中的struct
可以。c++中struct和class的主要区别在于默认的存取权限不同,struct默认为public,而class默认为private
10、void getmemory(char *p)
{
p=(char *) malloc(100); strcpy(p,“hello world”); }
int main( ) {
char *str=NULL; getmemory(str); printf(“%s/n”,str); free(str); return 0;
}会出现什么问题?
【标准答案】程序崩溃,getmemory中的malloc 不能返回动态内存, free()对str操作很
危险。
11、 char szstr[10];
strcpy(szstr,\产生什么结果?为什么?
【标准答案】长度不一样,出现段错误。
12、数组和链表的区别?
【标准答案】数组:数据顺序存储,固定大小;
链表:数据可以随机存储,大小可动态改变 13、 void main() { char aa[10]; printf(“%d”,strlen(aa));
} 会出现什么问题?打印结果是是多少?
【标准答案】sizeof()和初不初始化,没有关系,strlen()和初始化有关,打印结果值未知。 14、给定结构struct A { char t:4; char k:4; unsigned short i:8; unsigned long m; };问sizeof(A) = ? 【标准答案】8 15、 struct name1{ char str; short x; int num;
};求sizeof(name1)? 【标准答案】8 16、 struct name2{ char str; int num; short x;
};求sizeof(name2)? 【标准答案】12 17、程序哪里有错误 wap( int* p1,int* p2 ) {
int *p; *p = *p1; *p1 = *p2; *p2 = *p; }
【标准答案】p为野指针
18、 c和c++中的struct有什么不同? 【标准答案】c和c++中struct的主要区别是c中的struct不可以含有成员函数,而c++中的struct
可以。c++中struct和class的主要区别在于默认的存取权限不同,struct默认为public,而class默认为private。
19、 (void *)ptr 和 (*(void**))ptr的结果是否相同?其中ptr为同一个指针。 【标准答案】(void *)ptr 和 (*(void**))ptr值是相同的 20、要对绝对地址0x100000赋值,我们可以用 (unsigned int*)0x100000 = 1234;
那么要是想让程序跳转到绝对地址是0x100000去执行,应该怎么做? 【标准答案】*((void (*)( ))0x100000 ) ( );
首先要将0x100000强制转换成函数指针,即:
(void (*)())0x100000 然后再调用它:
*((void (*)())0x100000)();
21、 int a,b,c 请写函数实现c=a+b ,不可以改变数据类型,如将c改为long int,关键是如何处理溢出问题
【标准答案】
bool add (int a, int b,int *c) {
*c=a+b;
return (a>0 && b>0 &&(*ca || *c>b))); }
22、关于内存的思考题(1)你能看出有什么问题? 23、关于内存的思考题(2)你能看出有什么问题? 25、关于内存的思考题(3)你能看出有什么问题? 26、关于内存的思考题(4)你能看出有什么问题?
27、 关键字volatile有什么含意? 并给出三个不同的例子。
【参考答案】一个定义为volatile的变量是说这变量可能会被意想不到地改变,这样,编译器
就不会去假设这个变量的值了。精确地说就是,优化器在用到这个变量时必须每次都小心地重新读取这个变量的值,而不是使用保存在寄存器里的备份。下面是volatile变量的几个例子:
1). 并行设备的硬件寄存器(如:状态寄存器)
2). 一个中断服务子程序中会访问到的非自动变量(Non-automatic variables) 3). 多线程应用中被几个任务共享的变量
28、嵌入式系统经常具有要求程序员去访问某特定的内存位置的特点。在某工程中,要求设置
一绝对地址为0x67a9的整型变量的值为0xaa66。编译器是一个纯粹的ANSI编译器。写代码去完成这一任务。
【参考答案】这一问题测试你是否知道为了访问一绝对地址把一个整型数强制转换
(typecast)为一指针是合法的。这一问题的实现方式随着个人风格不同而不同。典型的类似代码如下: int *ptr;
ptr = (int *)0x67a9; *ptr = 0xaa55;
29、头文件中的 ifndef/define/endif 干什么用? 【标准答案】防止该头文件被重复引用。
30、#include
【标准答案】对于#include
对于#include “filename.h” ,编译器从用户的工作路径开始搜索 filename.h 。 31、const 有什么用途?(请至少说明两种)
【标准答案】: (1)可以定义 const 常量 (2)const 可以修饰函数的
参数、返回值,甚至函数的定义体。被 const 修饰的东西都受到强制保护,可以预防意外的变动,能提高程序的健壮性。 32、 static有什么用途?(请至少说明两种)
【标准答案】 1.限
制变量的作用域(static全局变量); 2.设置变量的存储域(static局部变量)。 33、堆栈溢出一般是由什么原因导致的?
【标准答案】没有回收垃圾资源。
34、如何引用一个已经定义过的全局变量?
【标准答案】可以用引用头文件的方式,也可以用extern关键字,如果用引用头文件方式来引
用某个在头文件中声明的全局变理,假定你将那个变量写错了,那么在编译期间会报错,如果你用extern方式引用时,假定你犯了同样的错误,那么在编译期间不会报错,而在连接期间报错。
35、全局变量可不可以定义在可被多个.C文件包含的头文件中?为什么?
【标准答案】可以,在不同的C文件中以static形式来声明同名全局变量。可以在不同的C文
件中声明同名的全局变量,前提是其中只能有一个C文件中对此变量赋初值,此时连接不会出错。
36、队列和栈有什么区别?
【标准答案】队列先进先出,栈后进先出。 37、 Heap与stack的差别。
【标准答案】Heap是堆,stack是栈。
Stack的空间由操作系统自动分配/释放,Heap上的空间手动分配/释放。 Stack空间有限,Heap是很大的自由存储区
C中的malloc函数分配的内存空间即在堆上,C++中对应的是new操作符。
程序在编译期对变量和函数分配内存都在栈上进行,且程序运行过程中函数调用时参数的传递也在栈上进行。
38、用宏定义写出swap(x,y),即交换两数。 【标准答案】 #define swap(x,
y) (x)=(x)+(y);(y)=(x)–(y);(x)=(x)–(y);
39、写一个“标准”宏,这个宏输入两个参数并返回较小的一个。 【标准答案】#define Min(X, Y) ((X)>(Y)?(Y):(X))//结尾没有; 40、带参宏与带参函数的区别(至少说出5点)? 【标准答案】
41、关键字volatile有什么含意?
【标准答案】提示编译器对象的值可能在编译器未监测到的情况下改变。
42、 int main() { int x=3; printf(\ return 1; }
问函数既然不会被其它函数调用,为什么要返回1?
【标准答案】mian中,c标准认为0表示成功,非0表示错误。具体的值是某中具体出错信息。 43、已知一个数组table,用一个宏定义,求出数据的元素个数。
【标准答案】
#define NTBL(table) (sizeof(table)/sizeof(table[0]))
44、 A.c 和B.c两个c文件中使用了两个相同名字的static变量,编译的时候会不会有问题?这两个static变量会保存到哪里(栈还是堆或者其他的)?
【标准答案】static的全局变量,表明这个变量仅在本模块中有意义,不会影响其他模块。
他们都放在静态数据区,但是编译器对他们的命名是不同的。 如果要使变量在其他模块也有意义的话,需要使用extern关键字。
百度搜索“77cn”或“免费范文网”即可找到本站免费阅读全部范文。收藏本站方便下次阅读,免费范文网,提供经典小说教育文库100条经典C语言笔试题目(全)在线全文阅读。
相关推荐: