c/c++的改错练习二

来源:互联网 发布:苹果手机4g网络显示lte 编辑:程序博客网 时间:2024/04/30 08:53

一  .选择

1。给出以下定义:

char acX[] = "abcdefg";

char acY[] = {'a','b','c','d','e','f'','g'};

则正确的叙述为(D)

A) 数组acX和数组acY等价                                 B) 数组acX和数组acY的长度相等                 

C)数组acX的长度大于数组acY的长度              D)数组acX的长度小于数组acY的长度

acX数组的元素已经确定,但acY的并不确定,无法判断‘g’的下一个元素是什么,不能判定它的‘\0’是不是下一个出现,所以准确来说,D选项也是有问题的

2。void example(char acHello[])

{

         printf("%d",sizeof(acHello));

         return ;

}

void main()

{

        char acHello[] = "hello,51_cc";

        example(acHello);

       return ;

}

的输出结果是(A)

A)  4                B) 12            C)13               D)不确定

acHello是一个数组,但他作为函数参数传递时,传递的是首元素的地址,也就是相当于一个指针,四个字节

3。以下叙述中不正确的是(C)

A)在不同的函数中可以使用相同名字的变量

B)函数中的形式参数是在栈中保存               //行参在栈中保存,实参在堆

C)在一个函数内定义的变量只在本函数范围内有效                    //在它的有效空间里有效,成对出现的括号

D)在一个函数内复合语句中定义的变量在本函数范围内有效(复合语句指函数中的成对括号构成的代码)

4。全局变量可以定义在被多个.c文件包含着的头文件中(B)

A)正确                     B)错误

不可以,因为每个.c文件引用该.h文件时,会对.h中的函数重新定义一次。
如果全局变量被定义在可被多个.c文件包含的头文件中时,就会出现重复定义。

所以,应该是在某个.c文件里面定义,在.h中用extern进行声明

5。在X86 下,有如下程序(32位小字节存储)

#include<stdio.h>

void main()

{

        union

        {

                short k;

                char i[2];

        }*s,a;

        s = &a ;

        s->i[0] = 0x39;

        s->i[1] = 0x38;

        printf("%x\n",a.k);

}

输出结果是(A)

A)    3839          B)3938                 C)380039               D)不确定

考察大小端问题。首先,不管是大端还是小端都是从低地址开始

大端:高位数据存放在低位地址,低位数据存放在高位地址

小端:高位数据存放在高位地址,低位数据存放在低位地址

6。#define BUF_LEN 2048

      struct AAA

     {

           unsigned long ulLen;

           char buf[BUF_LEN];

      };

函数PrintBufLen的作用是打印出结构体中buf的实际占用长度,有下面两种实现方法:

方法一:

void PrintBufLen(struct AAA *pBuf)

{

     if(NULL == pBuf)

      {

            printf("Error,pBuf is NULL.\n");

            return;

      }

    printf("len = %u",pBuf->ulLen);

    return;

}

方法二:

void PrintBufLen(struct AAA Buf)

{

     printf("len = %u \n".Buf.ulLen);

    return;

}

以下说法只有一个正确的是(A)

A:优选方法一,原因是以指针作为入参,减少函数参数压栈的系统开销

B:   优选方法二,原因是可以不做入参合法性判断,不容易出错

C:   两种方法一样,可以任选一种

D:   以上说法都不对

///////////////////////////////////////////////////////////////////

对程序而言,两种方法都是正确的,第一种用指针调动,第二种以对象调动,显然,方法二用对象调动,会调动它的构造,析构函数,时间,空间都要比指针的大,所以 A正确

7。有如下宏定义和结构定义

#define MAX_SIZE A+B

struct _Record_Struct

{

      unsigned char Env_Alarm_ID  :  4       //////////表示位域,表示占了一个字节的四位

      unsigned char Paral  :  2;

      unsigned char state;

      unsigned char avail  : 1;

}*Env_Alarm_Record;

struct   _Record_Struct  *Pointer  =  (struct  _Record_Struct*)malloc(sizeof(struct  _Record_Struct)  * MAX_SIZE);

当A = 2,B = 3时,pointer分配(D)个字节的空间

A)     20               B)      15              C)        11                D)9

如果是结构体,总空间应该是占最大空间元素的整倍数,如果是联合体,直接各元素所占空间直接相加

所以应该是  3×2+3 = 9

8。在X86,VC++6.0环境下,有下列程序

#include<stdio.h>

int main()

{

       char c;       //  范围是-128~127

       unsigned char uc;    //  范围是 0~255

       unsigned short us;  

       c = 128;  //128 = -128

       uc = 128;

      us = c +  uc;   //us= -128 +128 = 0  = 0x0

      printf("0x%x", us);

   

      us  = (unsigned char)c +uc;  //c强转为无符号char型,us= 128+128 = 256  = 0x100

      printf("0x%x", us);

 

      us = c + (char)uc; //uc强转成字符型,结果为-128 ,us= -128-128 = -256    以0000 0001 0000 0000 存放,原码为 1111 1111 0000 0000 = 0xff00

      printf("0x%x", us);

      return 0;

}

输出结果是(A)

A)0x0  0x100   0xff00

B)   0x100 0x100 0xff00

C)  0x100 0x100 0x0

D)  0x0 0x100 0x0

8。#include<stdio.h>

unsigned short *sum (unsigned char a,unsigned char b)

{

     unsigned short  s = 0;

    s = a + b;

    return &s;

}

int main()

{

      unsigned short *p = NULL;

     unsigned char a =1,b =2;

     p = sum(a,b);

     printf("%u + %u",a,b);

     printf("= %u\n",*p);

     return 0;

}

程序的执行结果为(A)

A) 1+2 = 0      B) 1+ 2 = 3          C)1 + 2  = NULL       D) 不确定

在sum函数中,s是创建的临时变量,函数结束后,s会被释放,作用域消失,返回值就会变得不确定

原创粉丝点击