C语⾔经典⾯试题100道(校对详解版)
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 )=
(4)void Func ( char str[100])
{
…… ;
}
请计算sizeof( str )=
(5)void *p=malloc(100);
sizeof( p )=
答案:
(1)sizeof(str)=6
(2) sizeof( p)=4
(3) sizeof(n)=4
(4) sizeof(str)=4
(5) sizeof( p)=4
详解:“Hello”中隐藏⼀个’\0’字符串结束符,32位程序内指针(即地址)也是32位,数组作为参数传⼊函数内,其实传⼊的是⾸地址,所以还是求的指针(即地址)⼤⼩
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("%d",sizeof(struct data)+sizeof(max));的执⾏结果是:_____
答案: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,"hello");
printf(str);
return0;
}
答案:没有为str分配内存空间,将会发⽣异常问题出在将⼀个字符串复制进⼀个字符变量指针所指地址。虽然可以正确输出结果,但因为越界进⾏内在读写⽽导致程序崩溃。
7.请问以下代码有什么问题:
char * s ="AAA";
printf("%s",s);林宜芝图片
s[0]='B';
printf("%s",s);
有什么错?
答案:“AAA” 是字符串常量。s是指针,指向这个字符串常量,所以声明s的时候就有问题。cosnt char * s =“AAA”;然后⼜因为是常量,所以对是s[0] 的赋值操作是不合法的。
8.int (*s[10])(int)表⽰的是什么
答案:int (*s[10])(int) 函数指针数组,每个指针指向⼀个int func ( int param) 的函数。(或⼀个有10个指针的数组,每个指针指向⼀个函数,该函数有⼀个整型参数并返回⼀个整型数)
表现爱国主义的诗句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);
return0;
}会出现什么问题?
答案:程序崩溃,getmemory中的malloc 不能传递动态内存,所以str⼀直是NULL,free ()对str操作很危险。
11.char szstr[10];
strcpy(szstr,"0123456789");
产⽣什么结果?为什么?
答案:长度不⼀样,出现段错误。字符串多⼀个’\0’结束符。
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
详解:char t:4;是代表使⽤位域结构,表⽰使⽤char的其中四位,char k:4;刚好可以把剩下四位⽤掉(假如不够则要重新使⽤⼀个char),所以⼀共是char(1)+short(2)+long(4)=7,字节对齐(char和short占⼀个字节,long占⼀个字节)后为8。
15.struct name1
{
char str;
short x;
int num;
};求sizeof(name1)?
答案:8
张铁林资料详解:char(1)+short(2)+int(4)=7,字节对齐(char和short占⼀个字节,int占⼀个字节)后为8。
16.struct name2
{
char str;
int num;
低值易耗品的摊销short x;
};求sizeof(name2)?
答案:12
详解:char(1)占第⼀个字节中的1,第⼀个字节剩下3不够int(4),所以为了对齐,重新⽤⼀个字节,in
t(4)刚好占满这第⼆个字节,所以short(2)⼜要重新⽤⼀个字节(其实只⽤了前2),⼀共是4+4+4=12。
17.程序哪⾥有错误
wap( int *p1,int *p2 )
{
int  *p;
*p = *p1;
*p1 = *p2;
*p2 = *p;
}
答案:申请p的时候没有初始化,所以p为野指针。
19.(void *)ptr 和(*(void**))ptr 的结果是否相同?其中ptr为同⼀个指针。
答案:(void )ptr 和((void**))ptr 值是相同的
详解:个⼈理解,void前⾯的*是取该地址内容的,所以本质⼀样。
20.要对绝对地址0x100000赋值,我们可以⽤
(unsigned int*)0x100000 =1234;
那么要是想让程序跳转到绝对地址是0x100000去执⾏,应该怎么做?
答案:((void ()( ))0x100000 ) ( );⾸先要将0x100000强制转换成函数指针,即:
(void (*)())0x100000
然后再调⽤它:
((void ()())0x100000)();
27.关键字volatile有什么含意? 并给出三个不同的例⼦。
答案:⼀个定义为volatile的变量是说这变量可能会被意想不到地改变,这样,编译器就不会去假设这
个变量的值了。精确地说就是,优化器在⽤到这个变量时必须每次都⼩⼼地重新读取这个变量的值,⽽不是使⽤保存在寄存器⾥的备份。下⾯是volatile变量的⼏个例⼦:
1). 并⾏设备的硬件寄存器(如:状态寄存器)
2). ⼀个中断服务⼦程序中会访问到的⾮⾃动变量(Non-automatic variables)
3). 多线程应⽤中被⼏个任务共享的变量
28.嵌⼊式系统经常具有要求程序员去访问某特定的内存位置的特点。在某⼯程中,要求设置⼀绝对地址为0x67a9的整型变量的值为0xaa66。编译器是⼀个纯粹的ANSI编译器。写代码去完成这⼀任务。
答案:这⼀问题测试你是否知道为了访问⼀绝对地址把⼀个整型数强制转换(typecast )为⼀指针是合法的。这⼀问题的实现⽅式随着个⼈风格不同⽽不同。典型的类似代码如下:
int * ptr;
ptr= (int *)0x67a9;
*ptr = 0xaa66;
29.头⽂件中的ifndef/define/endif ⼲什么⽤?
答案:防⽌该头⽂件被重复引⽤。
30.#include  <filename.h>    和 #include  “filename.h” 有什么区别?
答案:对于#include <filename.h> ,编译器从标准库路径开始搜索filename.h ; 对于#include “filename.h” ,编译器从⽤户的⼯作路径开始搜索filename.h 。
答案:(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有什么含意?