C语言面试经典笔试题分析、实践,BAT面试笔试题精讲

考点关键词

关键字:static、局部变量、全局变量

1、static全局变量与普通全局变量、static局部变量和普通局部变量、static函数与普通函数有什么区别?

本质上:是对内存模型的考察。可以从内存分配空间、使用范围解答。
static全局变量与普通全局变量:
首先,内存分配位置不同,虽然都在静态全局数据区,但是static修饰的全局变量在.bss文件中,全局变量在.data文件中。
其次,使用范围不同,static修饰的全局变量使用范围是在本文件中,外部文件不可以使用;全局变量不仅本文件中可以使用,其他文件也可以使用。
static局部变量和普通变量:
首先,内存分配位置不同,static修饰的局部变量在静态全局数据区,局部变量在栈区。
其次,使用范围不同,static修饰的局部变量只初始化一次,下一次依据上一次结果值,局部变量的使用范围是在函数定义开始到结束为止。
static函数与普通函数:
首先,内存分配位置不同,static函数在静态全局区,普通函数在静态全局区。
其次,

static全局变量只初始化一次,防止在其他文件单元中被引用;
static局部变量只初始化一次,下一次依据上一次结果值;
static函数在内存中只有一份,普通函数在每个被调用中维持一份拷贝。

2、全局变量可不可以定义在可被多个.c文件包含的头文件中?为什么?

不可以,应该在源文件中定义。头文件可能会重复包含,可能会被多次定义。为什么会被多次定义,你没有加头文件宏定义吗?

3、局部变量能否和全局变量重名?

可以,但是最好不要这样命名。在局部变量的作用域内,是局部变量的处理。其余是全局变量的作用范围。

4、如何在其他文件引用一个已经定义过的全局变量?

extern

关键词堆栈,内存管理

1、stack与heap的差别

首先介绍栈空间和堆空间,再说明他们的差别。
栈空间由操作系统自动分配/释放,空间有限;堆空间是手动分配/释放,堆上有很大的自由存储区;
程序在编译期对变量和函数分配内存、程序运行过程中函数调用时参数的船体都在栈上进行。

堆空间是存储动态分配
栈空间是存储局部变量和函数参数

2、堆栈溢出的原因

应该怎么分析?什么原因会造成栈空间爆满?栈存储的是局部变量,也就说局部变量一直在被定义
栈溢出:
死循环或者递归太深,递归的原因,可能太大,也可能没有终止。
死循环,会重复定义函数中的变量,造成内存爆满。
堆溢出:不断malloc空间,一直创建新的对象,没有free。

关键词:指针、数组、函数

unsigned char *p1;
unsigned long *p2;

p1 = (unsigned char *)0x801000;
p2 = (unsigned long *)0x810000;

请问p1 + 5 = ? ; p2 + 5 = ?;
p1是指向无符号char类型的指针 unsigned char 1字节 所以p1 + 5 = 0x801005
p2是指向无符号long类型的指针 unsigned long 4字节 所以p2 + 5 = 0x801014

main ()
{
	 int a[5] = {1,2,3,4,5};
    int *ptr = (int *)(&a + 1);
    printf("%d,%d\n",*(a + 1), *(ptr - 1));     // 2 5 为什么是5
    return 0;
}

2 是数组名加一 加的是4字节 2的地址
为什么是5?ptr指向int类型的指针

此题主要是区分 (a + 1) 和(&a + 1)的区别。

下面这个程序执行后会有什么错误或者效果:

#include <stdio.h>

#define MAX 10

int main()
{
    unsigned char A[MAX],i;

    for (i = 0; i <= MAX; i++)
    {
        A[i] = i;
    }

    return 0;
}

循环了11次,而数组的空间只有10大小。到第11次赋值,会数组越界。数组下标0到MAX-1

位运算

1、请写出求2的3次方最快的方法

int number = 2;
number << 3;

2、交换两个变量的值,不使用第三个变量。即a = 3, b = 5,交换之后a = 5, b = 3

这个不会。这个应该不是交换,是直接改变原先的值。通过异或运算

宏定义

1、用宏定义写出swap(x,y)

#define swap(x,y)  ((x) = (x + y), (y) = (x - y), (x) = (x - y))
#define swap(x,y)  (x)^=(y)^=(x)^=(y)

2

#define add(a,b) a + b
int main()
{
	printf("%d",3*add(4,7));			//19
}

数据结构应用

简述怎么用两个栈实现一个队列的功能?

写一个函数判断一个字符串里的小括号、大括号是否匹配。

栈应用:四则运算器

实现单链表逆置

排序

实现冒牌排序

手写快速排序。复杂度?给定 1,4,5,5,8,9,7,在快排中两个5是否会被交换?

给定一个含有n个正整数的整型数组,请你将n个数的顺序重新排列,给出可能得出的最大正整数。

比如给定数组(555,53,5),则最大正整数55355

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值