1. 如下语句通过算术运算和逻辑运算之后 i 和 j 的结果是()
         int i=0;
         int j=0;
         if((++i>0)||(++j>0))
         {//打印出i和j的值。}
    //i=1;j=0    短路原则,如果是 || ,前面真后面就不执行,如果是 && 前面为真后面才执行。

2.用宏定义写出swap(x,y)
答#define swap(x, y)
  x = x + y;
  y = x - y;
  x = x - y;

3.下述三个有什么区别?
  char * const p;   //常量指针,p的值不可以修改
  char const * p;  //指向常量的指针,指向的常量值不可以改
  const char *p;   //和char const *p

指针和const修饰符:记住以下一个规则就足够了,即以'*'为分界,左边是对象,右边是指针。
    1)如果const位于*的左侧,表示const就是用来修饰指针所指向的变量,即指针指向为常量。指针指向const对象,指针可变,对象不可变。
    2)如果const位于*的右侧,表示const就是修饰指针本身,即指针本身是常量。表示const指针,指针不可修改,对象可以修改。

4.指针和数组区别:
数组时连续分配一串单元,数目开始定义的时候就必须固定下来;
指针存放一个地址值,表示指向某一个单元,可以用指针来索引单元。

5.0就是stdin,表示输入流,指从键盘输入,1代表stdout,2代表stderr

6.指出下面代码的输出,并解释为什么。
main()
{
  int a[5]={1,2,3,4,5};
  int *ptr=(int *)(&a+1);
  printf("%d,%d",*(a+1),*(ptr-1));
}
输出:2,5
*(a+1)就是a[1],*(ptr-1)就是a[4],执行结果是2,5
&a+1不是首地址+1,系统会认为加一个a数组的偏移,是偏移了一个数组的大小(本例是5个int)。
原因如下:
&a是数组指针,其类型为 int (*)[5];
而指针加1要根据指针类型加上一定的值,
不同类型的指针+1之后增加的大小不同
a是长度为5的int数组指针,所以要加 5*sizeof(int)
所以ptr实际是a[5]
但是prt与(&a+1)类型是不一样的(这点很重要)
所以prt-1只会减去sizeof(int*)
a,&a的地址是一样的,但意思不一样,a是数组首地址,也就是a[0]的地址,&a是对象(数组)首地址,a+1是数组下一元素的地址,即a[1],&a+1是下一个对象的地址,即a[5].

7.再看看下面的一段程序有什么错误:
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;
}

8下面4个例子中存在哪些问题,请一一指出:
(1)、
void GetMemory( char *p )
{
 p = (char *) malloc( 100 );
}

void Test( void )
{
 char *str = NULL;
 GetMemory( str );
 strcpy( str, "hello world" );
 printf( str );
}

(2)、
char *GetMemory( void )
{
 char p[] = "hello world";
 return p;
}

void Test( void )
{
 char *str = NULL;
 str = GetMemory();
 printf( str );
}

(3)、
void GetMemory( char **p, int num )
{
 *p = (char *) malloc( num );
}

void Test( void )
{
 char *str = NULL;
 GetMemory( &str, 100 );
 strcpy( str, "hello" );
 printf( str );
}

(4)、
void Test( void )
{
 char *str = (char *) malloc( 100 );
 strcpy( str, "hello" );
 free( str );
 ... //省略的其它语句
}

(1)、GetMemory( char *p )函数的形参为字符串指针,在函数内部修改形参并不能真正的改变传入形参的值,执行完char *str =NULL;GetMemory( str );后的str仍然为NULL;
(2)、char p[] = "hello world"; return p;的p[]数组为函数内的局部自动变量,在函数返回后,内存已经被释放。这是许多程序员常犯的错误,其根源在于不理解变量的生存期。
(3)、GetMemory避免了试题4的问题,传入GetMemory的参数为字符串指针的指针,但是在GetMemory中执行申请内存及赋值语句*p = (char *)malloc( num );后未判断内存是否申请成功,应加上:
if ( *p == NULL )
{
 ...//进行申请内存失败处理
}
(4)、试题4存在与试题3同样的问题,在执行char *str = (char *) malloc(100);后未进行内存是否申请成功的判断;另外,在free(str)后未置str为空,导致可能变成一个“野”指针,应加上:str = NULL;试题3的Test函数中也未对malloc的内存进行释放。

最新文章

  1. mysql 分表
  2. XML:使用DOM技术解析xML文件中的城市,实现select级联选择
  3. 使用抓包工具SpyNet对你的网络进行监控
  4. Android:Butter Knife 8.0.1配置
  5. STL--STL和她的小伙伴们:
  6. 递归遍历XML节点属性和属性值
  7. frame嵌套的学习
  8. IIS报500.0错误
  9. Shell使用
  10. php学习笔记(1)
  11. webform 不实用office控件导出excel StringBuilder 类型拼接字符串表格导出excel
  12. 搞清楚学习Web的目的,是为了推广自己的产品和服务,不是为了替人接单做网页
  13. VR全景项目领导者,VR全景智慧城市
  14. struts2相关简单介绍
  15. 剑指Offer-二叉树的下一个结点
  16. partition分区
  17. provisional headers are shown 知多少
  18. FreeMaker使用HashMap
  19. firedac数据集数据序列为JSON
  20. Linux那些事儿之我是Hub(大结局)挂起自动化【转】

热门文章

  1. WebApp页面开发小结
  2. Docker的前世今生
  3. Integer 与 int 中的 ==
  4. PAT 天梯赛 L2-010. 排座位 【并查集】
  5. session不能使用 ASP.NET MVC
  6. 每天一个Linux命令(34)grep命令
  7. JS饼状图表数据分布插件
  8. apache中配置php支持模块模式、cgi模式和fastcgi模式的实验
  9. stdcall、cdecl详解(以及WINAPI和CALLBACK之类的宏对应什么)
  10. linux学习系列三