c语言常见面试题目及答案,c语言常见面试题目

本文列举了C语言面试中常见的问题,包括预处理指令、宏定义、指针、静态变量、中断服务子程序、内存访问、动态分配内存等问题的解析,同时探讨了C与C++的区别、递归函数应用和TCP/UDP端口号等知识点。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1. 用预处理指令 #define 声明一个常数,用以表明 1年中有多少秒(忽略闰年问题)

#define SECONDS_YEAR

(365*24*60*60UL)

int main()

{

printf("the answer is: %lu\n",SECONDS_YEAR);

注意在gcc中 long unsiged int 输出为%lu

2. 写一个 “标准 ”宏MIN ,这个宏输入两个参数并返回较小的一个。

#define MIN(A,B) ((A)>(B)?(B):(A))

int main()

{

printf("the answer is: %d\n",MIN(3,4));

这里的A,B只能输入整数

3.用变量 a给出下面的定义

一个指向指针的的指针,它指向的指针是指向一个整型数  int **a

一个有 10个指针的数组,该指针是指向一个整型数的  int

*a[10]

一个指向有 10个整型数数组的指针  int (*a)[10]

一个指向函数的指针,该函数有一个整型参数并返回一个整型数  int (*a)(int)

一个有 10个指针的数组,该指针指向一个函数,该函数有一个整型参数并返回一个整型数  int (*a[10])(int)

4.关键字 static的作用是什么?

a.描述静态变量,一个被声明为静态的变量在这一函数被调用过程中维持其值不变。

b.描述全局变量,一个被声明为静态的变量可以被模块内所用函数访问,但不能被模块外其它函数访问。

一个被声明为静态的函数只可被这一模块内的其它函数调用。

那就是, 这个函数被限制在声  明它的模块的本地范围内使用。

5.下面的函数有什么错误:

int square(volatile int *ptr)

{

return *ptr * *ptr;

}

一个定义为 volatile 的变量是说这变量可能会被意想不到地改变,这样,编译器就不会去假设这个变量的值

了。精确地说就是,优化器在用到这个变量时必须每次都小心地重新读取这个变量的值,而不是使用保存 在寄存器里的备份。

Ptr内容可能被修改,无法保证两次取得同一个值,应该先取出值放入一个变量中,然后通过这个变量来计算

6.嵌入式系统经常具有要求程序员去访问某特定的内存位置的特点。在某工程中,要求设置一绝对地址 为0x67a9的整型变量的值为

0xaa66。编译器是一个纯粹的 ANSI 编译器。写代码去完成这一任务。

int *p;

P=(int*)0x67a9;

*p=0xaa66;

7.中断是嵌入式系统中重要的组成部分,这导致了很多编译开发商提供一种扩展—让标准C支持中断。具代表事实是,产生了一个新的关键字

__interrupt。下面的代码就使用了__interrupt关键字去定义了一个中断服务子程序(ISR),请评论一下这段代码的。

__interrupt

double compute_area (double radius)

{ double area =

PI * radius * radius;

printf(” Area =

%f”, area);

return

area;

}

这个函数有太多的错误了,以至让人不知从何说起了:

1). ISR

不能返回一个值。如果你不懂这个,那么你不会被雇用

### 嵌入式C语言面试题目答案 #### 题目一:什么是volatile关键字?为什么在嵌入式编程中重要? `volatile` 是一种类型修饰符,告诉编译器该变量可能会被意想不到地改变[^1]。这意味着编译器不应该对该变量的操作做任何优化,因为它的值可能随时由外部因素更改(如硬件中断)。这在处理寄存器映射、全局变量以及多线程环境中非常重要。 ```c volatile int flag; ``` #### 题目二:解释一下内联函数的作用是什么? 内联函数是一种建议给编译器的方式,表示应该将函数体直接插入到调用处而不是通过常规的函数调用来执行[^2]。这样做可以减少函数调用开销并提高性能,尤其是在频繁调用的小型函数上特别有用。然而,过度使用可能导致代码膨胀。 ```c inline void inlineFunction(void) { // 函数实现 } ``` #### 题目三:如何防止缓冲区溢出攻击? 为了预防缓冲区溢出漏洞,应避免使用不安全的标准库函数如 `gets()` 和 `strcpy()` ,而改用更安全的选择比如 `fgets()` 或者带有长度参数的安全版本函数来代替它们[^4]。此外,在编写代码时始终要验证输入数据的有效性和边界条件。 ```c char buffer[10]; // 不推荐的做法 gets(buffer); // 推荐做法 if (fgets(buffer, sizeof(buffer), stdin)) { // 处理读取的数据... } ``` #### 题目四:描述一下临界区的概念,并给出一个简单的例子说明怎样保护它。 当多个进程或线程试图访问共享资源时会发生竞争状况;此时就需要定义一段称为“临界区”的特殊区域以确保同一时刻只有一个实体能够进入操作这些资源。通常会采用互斥锁机制来进行同步控制: ```csharp object obj = new object(); lock(obj) { // 临界区内受保护的代码逻辑 } translates to try{ Monitor.Enter(obj); // 临界区内受保护的代码逻辑 } finally { Monitor.Exit(obj); } ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值