请选择 进入手机版 | 继续访问电脑版
hot【项目分享】之智能交通灯

结合前几次GPIO的简单了解和学习,今天给大家分享一个GPIO的简单应用:智能交通灯 涉及硬件:开发套件 详细

开启左侧

C语言常见笔试题

  [复制链接]
 楼主| 张勇涛 发表于 2017-3-10 17:49:37 | 显示全部楼层
找错题

试题1:

void test1()
{
 char string[10];
 char* str1 = "0123456789";
 strcpy( string, str1 );
}

  试题2:

void test2()
{
 char string[10], str1[10];
 int i;
 for(i=0; i<10; i++)
 {
  str1 = 'a';
 }
 strcpy( string, str1 );
}

  试题3:

void test3(char* str1)
{
 char string[10];
 if( strlen( str1 ) <= 10 )
 {
  strcpy( string, str1 );
 }
}
 楼主| 张勇涛 发表于 2017-3-10 18:08:53 | 显示全部楼层
下面的一段程序有什么错误:

swap( int* p1,int* p2 )
{
 int *p;
 *p = *p1;
 *p1 = *p2;
 *p2 = *p;
}

  在swap函数中,p是一个“野”指针,有可能指向系统区,导致程序运行的崩溃。
该程序应该改为:

swap( int* p1,int* p2 )
{
 int p;
 p = *p1;
 *p1 = *p2;
 *p2 = p;
}
 楼主| 张勇涛 发表于 2017-3-10 18:09:33 | 显示全部楼层
分别给出bool,int,float,指针变量 与“零值”比较的 if 语句(假设变量名为var)

  解答:

   bool型变量:if(!var)

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

   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分。
 楼主| 张勇涛 发表于 2017-3-10 18:11:13 | 显示全部楼层
以下为Linux下的32位c程序,请计算sizeof的值

void func ( char str[100] )
{
 sizeof( str ) = ?
}

void *p = malloc( 100 );
sizeof ( p ) = ?

  解答:
……
sizeof( str ) = 4
sizeof ( p ) = 4

char str[10];
cout << sizeof(str) << endl;
 楼主| 张勇涛 发表于 2017-3-10 18:12:20 | 显示全部楼层
写一个“标准”宏min,这个宏输入两个参数并返回较小的一个。另外,当你写下面的代码时会发生什么事?

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

  解答:

#define MIN(a,b) ((a) <= (b) ? (a) : (b))

  MIN(*p++, b)会产生宏的副作用
 楼主| 张勇涛 发表于 2017-3-10 18:14:30 | 显示全部楼层
为什么标准头文件都有类似以下的结构?

#ifndef __incvxworksh
#define __incvxworksh
#ifdef __cplusplus

extern "c" {
#endif
/*...*/
#ifdef __cplusplus
}

#endif
#endif /* __incvxworksh */

  解答:

  头文件中的编译宏

#ifndef __incvxworksh
#define __incvxworksh
#endif
    的作用是防止被重复引用。
为了实现c和c++的混合编程,c++提供了c连接交换指定符号extern "c"来解决名字匹配问题,函数声明前加上extern "c"后,则编译器就会按照c语言的方式将该函数编译为_foo,这样c语言中就可以调用c++的函数了。
 楼主| 张勇涛 发表于 2017-3-10 18:15:43 | 显示全部楼层
编写一个函数,作用是把一个char组成的字符串循环右移n个。比如原来是“abcdefghi”如果n=2,移位后应该是“hiabcdefgh”
 楼主| 张勇涛 发表于 2017-3-10 18:16:01 | 显示全部楼层
张勇涛 发表于 2017-3-10 18:15
编写一个函数,作用是把一个char组成的字符串循环右移n个。比如原来是“abcdefghi”如果n=2,移位后应该是 ...

自己完成
 楼主| 张勇涛 发表于 2017-3-10 18:17:48 | 显示全部楼层
请写一个c函数,若处理器是big_endian的,则返回0;若是little_endian的,则返回1
 楼主| 张勇涛 发表于 2017-3-10 18:18:51 | 显示全部楼层
堆和栈的区别?
栈区(stack)- 由编译器自动分配释放 ,存放函数的参数值,局部变量的值等。其操作方式类似于数据结构中的栈。
堆区(heap) - 一般由程序员分配释放, 若程序员不释放,程序结束时可能由OS回收 。
1) 从静态存储区域分配。内存在程序编译的时候就已经分配好,这块内存在程序的整个运行期间都存在。例如全局变量,static 变量。
2) 在栈上创建。在执行函数时,函数内局部变量的存储单元都可以在栈上创建,函数执行结束时这些存储单元自动被释放。栈内存分配运算内置于处理器的指令集。
3) 从堆上分配,亦称动态内存分配。程序在运行的时候用malloc 或new 申请任意多少的内存,程序员自己负责在何时用free 或delete 释放内存。动态内存的生存期由程序员决定,使用非常灵活,但问题也最多。

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

关注0

粉丝13

帖子82

发布主题
阅读排行 更多
广告位
0351-8210788
周一至周日 9:00-18:00
意见反馈:mind@unigress.com
关注我们

扫一扫关注我们

Powered by Discuz! X3.4 Licensed  © 2001-2013 Comsenz Inc.( 晋ICP备12005011 )