华为2016应届生笔试题错题集

给出以下定义:

       char acX[] = “abcdefg”;

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

       则正确的叙述为(    )

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

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

分析:

对于char acX[] = “abcdefg”; 其长度为7

对于char acY[] = {‘a’,’b’,’c’,’d’,’e’,’f’,’g’}; 由于无结束符‘\0’,所以编译器无法判断长度,其是随机值,但是长度大于或等于7,从做题角度来看,我们选择D。

 

CPU(32位小字节序处理器)

void example(char acHello[])

   {

        printf(“%d”,sizeof(acHello));

        return;

}

void main()

{

    char acHello[] = “hello,51_CC”;

    example(acHello);

    return;

}

的输出结果是(    )

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

分析:

对于example(acHello);   acHello本身为数组,但是现在作为函数的参数传递,退化为指针,处理器为32位,因此sizeof(acHello)值为4。

选A

 

设有如下定义:

unsigned long pulArray[] = {6,7,8,9,10};

unsigned long *pulPtr;

则下列程序段的输出结果为(    )

pulPtr = pulArray;

*(pulPtr + 3) += 3;

printf(“%d ,%d\n”,*pulPtr, *(pulPtr + 3));

A) 9,12         B) 6,9          C) 6,12          D)6,10

分析:

*(pulPtr + 3) += 3;相当于*(pulPtr + 3)  = *(pulPtr + 3) + 3; 相当于给数组第四个元素加4,9->12;

而指针指向不会发生变化,则*pulPtr相当于取数组第一个元素值,为6,

*(pulPtr + 3)相当于取数组第四个元素的值,为12.

选C

 

void example()

   {

        int i;

        char acNew[20];

        for(i = 0; i < 5; i++)

        {

            acNew[i] = ‘0’;

}

printf(“%d\n”,strlen(acNew));

return ;

}

的输出结果为(    )

A) 0          B) 5         C) 6          D)不确定

分析:

数组acNew[20]; 未初始化,for循环给数组前五个元素赋了五个字符'0',但是没有结束符'\0',则其大小不确定。

注:若char acNew[20] = {0};该题答案会是多少呢?

这样相当于给数组初始化了,初始化都为0,赋值后,现在数组有结束符,可以判断大小了,为5.

本题选D

 

struct stu

   {

        int num;

        char name[10];

        int age;

};

void fun(struct stu *p)

{

    printf(“%s\n”,(*p).name);

    return;

}

void main()

{

    struct stu students[3] = {{9801,”zhang”,20},

{9802,”wang”,19},

{9803,”zhao”,18}};

            fun(students + 1);

            return ;

}

的输出结果为(    )

A) zhang         B)zhao         C) wang          D)18

分析:

fun(students + 1);

students为结构体类型,students + 1 ,此处加1相当于加一个结构体大小,即参数传的是students[1]的地址,则(*p).name取的值为wang。

选C

 

在X86下,有下列程序

CPU(32位小字节序处理器)

   #include

   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) 3839          B) 3938         C) 380039          D)不确定

分析:

处理器是小端存储模式,低地址存0x39,高地址存0x38,小端模式从高地址往低地址输出数据,而union共享存储空间,此时求a.k相当于取i[2]里面的数据,从高地址往低地址输出,则为3839.

选A

 

 设有以下宏定义:

    #define N 4

    #define Y(n) ((N+2)*n) /*这种定义在编程规范中是严格禁止的*/

    则执行语句:z = 2 * (N + Y(5+1));后,z的值为(    )

A) 出错         B) 60        C) 48          D) 70

分析:

这种题,直接将宏代入即可,z = 2 * (N + Y(5+1))相当于z = 2*(4 + ((4+2)*5 + 1)))= 70

则选D

 

 void main()

        {

            unsigned char a = 200;

            unsigned char b = 100;

            unsigned char c = 0;

            c = a + b;

            printf(“%d %d”, a+b,c);

}

程序的执行结果为(    )

A) 300 300        B) 44 44        C) 300 44         D) 44 300

分析:

对于无符号char,其取值范围为0~255,a+b = 300,直接输出即可

而对于 c = a + b,a+b的值赋给c了,而c为无符号字符类型,最大上限为255,300-256 = 44.

则选C。

 

#include

        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)1+2=0        B) 1+2=3       C) 1+2=NULL         D)不确定

分析:

这道题考点是局部变量,p = sum(a, b); 对于函数sum,传给函数两个值,函数内部将两值相加,再返回s的地址,但是由于s为局部变量,当sum函数调用结束后,s的内存空间会被回收,则*p的值不确定。

选D。

你可能感兴趣的:(牛客网刷题随记,笔试题错题集)