C语言面试易错题目分享
1、关键字static的作用是什么?
答:关键字static有三种作用:
(1). 在函数内部:将某一变量声明为静态变量,函数调用结束该变量内存也不会被释放,直到程序结束。
(2). 在函数外部(某个.c文件内):被该关键字声明过的变量可以被当前文件内的函数访问及使用,但是不能被其
它文件内的函数访问和使用。
(3). 修饰函数:一个被声明为静态的函数只能被这一文件内的其它函数调用,不能被其它文件的函数调用。
2、关键字const是什么含意?并说明以下声明代表什么含义?
const int a;
int const a;
const int *a;
int * const a;
int const * a const;
答:const可以简单理解为“只读”
前两种表示a是一个常整型数。第三种意味着a是一个指向常整型数的指针(整型数是不可修改,指针可以)。
第四种意思a是一个指向整型数的常指针(即指针指向的整型数是可以修改的,但指针是不可修改的)。
最后一种意味着a是一个指向常整型数的常指针(也就是说,指针指向的整型数是不可修改的,同时指针也是不可修改的)。
3、全局变量和局部变量在内存中是否有区别?如果有,是什么区别?
答 :全局变量储存在静态数据区,局部变量在堆栈中。
4、#include <<file.h>> 与 #include “file.h”的区别?
答:前者是从Standard Library的路径寻找和引用file.h,后者是从当前工作路径搜寻并引用file.h。
5、堆栈溢出一般是由什么原因导致的?
答 :1.资源申请太多,没有释放 2.递归调用的层次过多
6、队列和栈有什么区别?
答:队列先进先出,栈后进先出
7、哪种类型不能做switch()的参数类型
答 :switch的参数不能为实型。
8、局部变量能否和全局变量重名?如果重名会怎样?
答:能,局部会屏蔽全局。
局部变量可以与全局变量同名,在函数内引用这个变量时,会用到同名的局部变量,而不会用到全局变量。对于有
些编译器而言,在同一个函数内可以定义多个同名的局部变量,比如在两个循环体内都定义一个同名的局部变量,
而那个局部变量的作用域就在那个循环体内
9、全局变量可不可以定义在可被多个.C文件包含的头文件中?为什么?
答 、可以,在不同的C文件中以static形式来声明同名全局变量。
可以在不同的C文件中声明同名的全局变量,前提是只能有一个C文件中对变量赋初值。
10、语句for( ;1 ;)有什么问题?它是什么意思?
答 、无限循环。
11、do……while和while……do有什么区别?
答 、前一个循环一遍再判断,后一个判断以后再循环。
12、一个由C/C++编译的程序占用的内存可以划分为哪几个部分?
答:
(1)栈区(stack):由编译器自动分配释放,存放函数的参数值,局部变量的值等。其操作方式类似于数据结构中的栈。
(2)堆区(heap):一般由程序员分配释放,若程序员不释放,程序结束时可能由OS回收。
(3)全局区(静态区)(static):全局变量和静态变量的存储是放在一块的,初始化的全
局变量和静态变量在一块区域,未初始化的全局变量和未初始化的静态变量在相邻的另一块
区域。程序结束后由系统释放。
(4)文字常量区:常量字符串就是放在这里的。程序结束后由系统释放。
(5)程序代码区:存放函数体的二进制代码
举例说明:
int a=1; //全局初始化区
char *p1; //全局未初始化区
main()
{
int b;//栈
char s[]=”abc”; //栈
char *p2; //栈
char *p3=”123456″; //123456\0在常量区,p3在栈上。
static int c=0; //全局初始化区
p1 = (char*)malloc(100);
p2 = (char*)malloc(200); //分配得来得100和200字节的区域就在堆区。
strcpy(p1,”123456″); //123456\0放在常量区
}
13、关键字volatile有什么含意 并给出三个不同的例子。
答:简单来说就是防止编译器优化,精确地说就是优化器在用到这个变量时必须每次都小心
地重新读取这个变量的值,而不是使用保存在寄存器里的备份。
下面是volatile变量的几个例子:
(1). 并行设备的硬件寄存器(如:状态寄存器)
(2). 一个中断服务子程序中会访问到的非自动变量(Non-automatic variables)
(3). 多线程应用中被几个任务共享的变量
14、结构与联合有和区别?
答:(1). 结构和联合都是由多个不同的数据类型成员组成, 但联合所有成员共用一块地址空
间, 联合中只存放了一个被选中的成员, 而结构的所有成员都存在,有自己独立的存储空间。
(2). 联合对其中某一成员赋值会导致其它成员值发生改变,结构对某一成员赋值不会对其它
成员造成影响。
15、简述数组与指针的区别?
答:指针可以随时指向任意类型的内存块。数组只能被创建在栈或是静态区。
16、用变量a给出下面的定义
a) 一个整型数
b) 一个指向整型数的指针
c) 一个指向指针的的指针,它指向的指针是指向一个整型数
d) 一个有10个整型数的数组
e) 一个有10个指针的数组,该指针是指向一个整型数的
f) 一个指向有10个整型数数组的指针
g) 一个指向函数的指针,该函数有一个整型参数并返回一个整型数)
h) 一个有10个指针的数组,该指针指向一个函数,该函数有一个整型参数并返回一个整型数
答:
a) int a; // An integer
b) int *a;
c) int **a;
d) int a[10];
e) int *a[10];
f) int (*a)[10];
g) int (*a)(int);
h) int (*a[10])(int);
17、请写出下列代码的输出内容
#include
main()
{
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
18、交换两个变量的值,不使用第三个变量。
答:
有两种解法, 一种用算术算法, 一种用^(异或)
a = a + b;
b = a - b;
a = a - b;
or
a = a^b;// 只能对int,char..
b = a^b;
a = a^b;
or
a ^= b ^= a;
19、求以下结构大小分别为多少?
struct name1{
char str;
short x;
int num;
} ;
struct name2{
char str;
int num;
short x;
};
求sizeof(name1)?
求sizeof(name2)?
答:sizeof(name1) = 8 sizeof(name2) = 12
20、(void )ptr 和((void))ptr 的结果是否相同?**
答:(void )ptr 和((void**))ptr 值是相同的
21、假设数组首地址为0x00000040、请写出以下程序输出结果.
#include <stdio.h>
int main(void)
{
int a[5];
printf("%p\n", a);
printf("%p\n", a+1);
printf("%p\n", &a);
printf("%p\n", &a+1);
}
答:
第一个:数组名代表数组的首地址,所以是:0x00000040
第二个:a+1,即数组第二个元素的地址,也就是:0x00000044
第三个:首先数组名即表示数组首地址也表示数组第一个元素的地址,a=&a=&a[0],所以输
出0x00000040
第四个:因为&a是一个数组,被看成int(*)[5],所以数组地址+1就相当于加了整个数组的长
度所以输出0x00000034
22、请计算以下sizeof的值
char str[] = "hello";
char *p = str;
int n = 10;
sizeof(str);
sizeof(p);
sizeof(n);
答:6 4 4