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.000001;                    
  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

3.计算:

void Func ( char str[100]){ 
…… ; 
}

请计算sizeof(str) = 

答案:4

void *p = malloc(100);

请计算sizeof(p) = 

答案:4

4、用变量a给出下面的定义
(a).一个有10个指针的数组,该指针是指向一个整型数的;
(b).一个指向有10个整型数数组的指针;
(c).一个指向函数的指针,该函数有一个整型参数并返回一个整型数;
(d).一个有10个指针的数组,该指针指向一个函数,该函数有一个整型参数并返回一个整型数;

答案:a. int *a[10];   b. int (*a)[10];   c. int (*a) (int);  d. 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 date)+sizeof(max));的执行结果是:__52___
答案:DATE是一个union,变量共用空间;里面最大的变量类型是int[5],占用20个字节,所以它的大小是20;date是一个struct,每个变量分开占用空间;依次为int4+DATE20+double8=32.

所以结果是20+32=52。

6、请问以下代码有什么问题:
int main(){
char a;
char *str=&a;
strcpy(str,"hello");
printf(str);
return 0;

}

答案:没有为str分配内存空间,将会发生异常问题出在将一个字符串复制进一个字符变量指针所指地址。虽然可以正确输出结果,但因为越界进行内在读写而导致程序崩溃。

7、请问以下代码有什么问题:
char* s="AAA";
printf("%s",s);
s[0]='B';
printf("%s",s);
有什么错?

答案:"AAA"是字符串常量。s是指针,指向这个字符串常量,所以声明s的时候就有问题。const char* s="AAA";然后又因为是常量,所以对是s[0] 的赋值操作是不合法的。

8、int (*s[10])(int)表示的是什么啊?

答案:int (*s[10])(int)是函数指针数组,每个指针指向一个int func(intp aram)的函数。

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);11、回答问题:
char szstr[10];
strcpy(szstr,"0123456789");
产生什么结果?为什么?
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,"0123456789");
产生什么结果?为什么?

答案:szstr数组的大小为10,"0123456789"字符串的长度是11,放不下;当打印szstr字符串时,输出没有结束符,打印结果不确定。

12、数组和链表的区别?

数组:数据顺序存储,固定大小;
链表:数据可以随机存储,大小可动态改变。

13、回答问题:
void main()
{
char aa[10];
printf(“%d”,strlen(aa));
}                                          
会出现什么问题?打印结果是是多少?

答案:sizeof()和初不初始化,没有关系,strlen()和初始化有关,打印结果为1。

14、给定结构
struct A
{
char t:4;            
char k:4;                    
unsigned short i:8;
unsigned long m;
}; 
问sizeof(A) = ?

答案:8。t和k占用一个字节,i占用两个字节,m占用4个字节。

15、计算:

struct name{
char str;
short x;
int num;
}
求sizeof(name) = ?
答案:8

16、计算:
struct name{
char str;
int num;
short x;
}; 
求sizeof(name) = ?
答案:12

17、程序哪里有错误:
wap(int* p1,int* p2){
int * p;
*p = *p1;
*p1 = *p2;
*p2 = *p;

}

答案:p是一个野指针,指向一个已删除的对象或未申请访问受限内存区域的指针。有可能导致程序崩溃。

18、(void *)ptr 和(*(void**))ptr的结果是否相同?其中ptr为同一个指针。
答案:(void *)ptr和(*(void**))ptr值是相同的。

20、要对绝对地址0x100000赋值,我们可以用(unsigned int*)0x100000 = 1234;那么要是想让程序跳转到绝对地址是0x100000去执行,应该怎么做?
答案:((void(*)())(0x100000))();

27、关键字volatile有什么含意? 并给出三个不同的例子。

一个定义为volatile的变量是说这变量可能会被意想不到地改变,这样,编译器就不会去假设这个变量的值了。精确地说就是,优化器在用到这个变量时必须每次都小心地重新读取这个变量的值,而不是使用保存在寄存器里的备份。下面是volatile变量
的几个例子:
1). 并行设备的硬件寄存器(如:状态寄存器);
2). 一个中断服务子程序中会访问到的非自动变量(Non-automatic variables);

3). 多线程应用中被几个任务共享的变量;

28、嵌入式系统经常具有要求程序员去访问某特定的内存位置的特点。在某工程中,要求设置一绝对地址为0x67a9的整型变量的值为0xaa66。编译器是一个纯粹的ANSI编译器。写代码去完成这一任务。

答案:这一问题测试你是否知道为了访问一绝对地址把一个整型数强制转换(typecast)为一指针是合法的。这一问题的实现方式随着个人风格不同而不同。典型的类似代码如下:

int *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。

31、const有什么用途?(请至少说明两种)

(1).可以定义const常量;
(2).const可以修饰函数的参数、返回值,甚至函数的定义体。被const修饰的东西都受到强制保护,可以预防意外的变动,能提高程序的健壮性。

32、static有什么用途?(请至少说明两种)

答案:
1.限制变量的作用域(static全局变量);
2.设置变量的存储域(static局部变量);

3.static修饰函数时,这个函数只能在本文件中使用。

33、堆栈溢出一般是由什么原因导致的?

答案:没有回收垃圾资源。动态分配的内存没有及时回收。

34、如何引用一个已经定义过的全局变量?

答案:可以用引用头文件的方式,也可以用extern关键字,如果用引用头文件方式来引用某个在头文件中声明的全局变理,假定你将那个变量写错了,那么在编译期间会报错,如果你用extern方式引用时,假定你犯了同样的错误,那么在编译期间不会报错,而在连接期间报错。












猜你喜欢

转载自blog.csdn.net/caihaitao2000/article/details/79835134