C语言面试题库1-4

本文详述了C语言面试中常见的题目,包括指针安全、数值比较、sizeof运算、宏定义以及堆栈的区别等知识点,并提供了正确解答和编程技巧,帮助考生准备C语言的面试。

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

1.下面的一段程序有什么错误:

swap(int* p1,int* p2 )

{

 int *p;

         /*p= NULL,NULL就是一个宏定义的0,但是不能够往*p里面写东西,因为这个是个常量,不能够给常量赋值*/

 *p = *p1;

 *p1 = *p2;

 *p2 = *p;

       在swap函数中,p是一个“野”指针,有可能指向系统区,导致程序运行的崩溃。在vc++中debug运行时提示错误“access violation”。该程序应该改为:

swap(int* p1,int* p2 )

{

 int p;

 p = *p1;

 *p1 = *p2;

 *p2 = p;

2.分别给出bool,int,float,指针变量 与“零值”比较的 if 语句(假设变量名为var)

  解答:

   bool型变量:if(!var)

   int型变量:if(0==var)

   float型变量:

   const float epsinon = 0.00001;

   if ((x >= - epsinon) && (x <= epsinon)

   指针变量:  if(var==null)

  剖析:

  考查对0值判断的“内功”,bool型变量的0判断完全可以写成if(var==0),而int型变量也可以写成if(!var),指针变量的判断也可以写成if(!var),上述写法虽然程序都能正确运行,但是未能清晰地表达程序的意思。

  一般的,如果想让if判断一个变量的“真”、“假”,应直接使用if(var)、if(!var),表明其为“逻辑”判断;如果用if判断一个数值型变量(short、int、long等),应该用if(var==0),表明是与0进行“数值”上的比较;而判断指针则适宜用if(var==null),这是一种很好的编程习惯。

  浮点型变量并不精确,所以不可将float变量用“==”或“!=”与数字比较,应该设法转化成“>=”或“<=”形式。如果写成if (x == 0.0),则判为错,得0分。

3.请计算sizeof的值 

void func ( char str[100] )

{

 sizeof( str ) = ?

}

void * p = malloc( 100 );

sizeof( p ) = ?

charstr[10];

cout<< sizeof(str) << endl;

解答:

……

sizeof(str ) = 4

sizeof( p ) = 4

sizeof(str) = 10

4.写一个“标准”宏min,这个宏输入两个参数并返回较小的一个。另外,当你写下面的代码时会发生什么事?

least= min(*p++, b);

解答:#definemin(a,b) ((a) <= (b) ? (a) : (b))

          min(*p++, b)会产生宏的副作用

 5.编写一个函数,作用是把一个char组成的字符串循环右移n个。比如原来是“abcdefghi”如果n=2,移位后应该是“hiabcdefg”

 函数头是这样的:

//pstr是指向以'\0'结尾的字符串的指针

//steps是要求移动的n

 void  loopmove ( char * pstr, int steps )

{

 //请填充...

}

 解答:正确解答1:

void loopmove ( char *pstr, int steps )

{

 int n = strlen( pstr ) - steps;

 char tmp[max_len];

 strcpy ( tmp, pstr + n );

 strcpy ( tmp + steps, pstr);

 *( tmp + strlen ( pstr ) ) = '\0';

 strcpy( pstr, tmp );

}

正确解答2:

void loopmove ( char *pstr, int steps )

{

 int n = strlen( pstr ) - steps;

 char tmp[max_len];

 memncpy( tmp, pstr + n, steps );

 memncpy(pstr + steps, pstr, n );

 memncpy(pstr, tmp, strlen(pstr));

6.堆和栈的区别?

          栈区(stack)- 由编译器自动分配释放 ,存放函数的参数值,局部变量的值等。其操作方式类似于数据结构中的栈。

          堆区(heap) -一般由程序员分配释放, 若程序员不释放,程序结束时可能由OS回收 。

          1)从静态存储区域分配。内存在程序编译的时候就已经分配好,这块内存在序的整个运行期间都存在。例如全局变量,static 变量。

         2)在栈上创建。在执行函数时,函数内局部变量的存储单元都可以在栈上创建,函数执行结束时这些存储单元自动被释放。栈内存分配运算内置于处理器的指令集。

         3)从堆上分配,亦称动态内存分配。程序在运行的时候用malloc或new申请任意多少的内存,程序员自己负责在何时用free 或delete释放内存。动态内存的生存期由程序员决定,使用非常灵活,但问题也最多。

7.struct和class 的区别 

        答案:struct 的成员默认是公有的,而类的成员默认是私有的。struct 和class 在其他方面是功能相当的。从感情上讲,大多数的开发者感到类和结构有很大的差别。感觉上结构仅仅象一堆缺乏封装和功能的开放的内存位,而类就象活的并且可靠的社会成员,它有智能服务,有牢固的封装屏障和一个良好定义的接口。既然大多数人都这么认为,那么只有在你的类有很少的方法并且有公有数据(这种事情在良好设计的系统中是存在的!)时,你也许应该使用struct 关键字,否则,你应该使用class 关键字。

8.下面代码输出结果为多少?

#include "stdafx.h"

#define SQR(X) X*X

int main(int argc, char* argv[])
{
    int a = 10;
    int k = 2;
    int m = 1;

 a /= SQR(k+m)/SQR(k+m);
    printf("%d\n",a);

 return 0;
}
这道题目的结果是什么啊?

宏替换:a /=2+1*2+1/2+1*2+1;a = 10/7 = 1;

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值