C语言面试题

    技术2022-05-19  22

    http://blogold.chinaunix.net/u/28908/showart_221117.html

    (本来是找一些关于大小端模式的质料,没想到看到一片好文,收场一下~_~)

     

    小端模式:计算机内部采用的方式,数据低位存放到低地址里面,高位存放到高地址里面;

    大端模式:网络传输数据采用的方式,数据高位存放到低地址里面,低位存放到高地址里面。

     

    试题1:请写一个C函数,若处理器是Big_endian的,则返回0;若是Little_endian的,则返回1

    解答:

    int checkCPU( )

    {

        {

               union w

               {  

                      int  a;

                      char b;

               } c;

               c.a = 1;

               return(c.b ==1);

        }

    }

    剖析:

    嵌入式系统开发者应该对Little-endianBig-endian模式非常了解。采用Little-endian模式的CPU对操作数的存放方式是从低字节到高字节,而Big-endian模式对操作数的存放方式是从高字节到低字节。例如,16bit宽的数0x1234Little-endian模式CPU内存中的存放方式(假设从地址0x4000开始存放)为:

    内存地址

    0x4000

    0x4001

    存放内容

    0x34

    0x12 

    而在Big-endian模式CPU内存中的存放方式则为:

    内存地址

    0x4000

    0x4001

    存放内容

    0x12

    0x34

    32bit宽的数0x12345678Little-endian模式CPU内存中的存放方式(假设从地址0x4000开始存放)为:

    内存地址

    0x4000

    0x4001

    0x4002

    0x4003

    存放内容

    0x78

    0x56

    0x34

    0x12

    而在Big-endian模式CPU内存中的存放方式则为:

    内存地址

    0x4000

    0x4001

    0x4002

    0x4003

    存放内容

    0x12

    0x34

    0x56

    0x78

    联合体union的存放顺序是所有成员都从低地址开始存放,面试者的解答利用该特性,轻松地获得了CPU对内存采用Little-endian还是Big-endian模式读写。如果谁能当场给出这个解答,那简直就是一个天才的程序员。

     

    2.

    char str[] = Hello ;

    char *p = str ;

    int n = 10;

    请计算

    sizeof (str ) = 6 2分)

    sizeof ( p ) = 4 2分)

    sizeof ( n ) = 4 2分)

    void Func ( char str[100])

    {

    请计算

    sizeof( str ) = 4 2分)

    }

    void *p = malloc( 100 );

    请计算

    sizeof ( p ) = 4 2分)

     

    3、在C++程序中调用被 C编译器编译后的函数,为什么要加 extern C”? (5分)

    答:C++语言支持函数重载,C语言不支持函数重载。函数被C++编译后在库中的名字与C语言的不同。假设某个函数的原型为: void foo(int x, int y);

    该函数被C编译器编译后在库中的名字为_foo,而C++编译器则会产生像_foo_int_int之类的名字。

    C++提供了C连接交换指定符号extern“C”来解决名字匹配问题。

    4.有关内存的思考题

    void GetMemory(char *p)

    {

    p = (char *)malloc(100);

    }

    void Test(void)

    {

    char *str = NULL;

    GetMemory(str);

    strcpy(str, "hello world");

    printf(str);

    }

    请问运行Test函数会有什么样的结果?

    答:程序崩溃。

    因为GetMemory并不能传递动态内存,

    Test函数中的 str一直都是 NULL

    strcpy(str, "hello world");将使程序崩溃。

    char *GetMemory(void)

    {

    char p[] = "hello world";

    return p;

    }

    void Test(void)

    {

    char *str = NULL;

    str = GetMemory();

    printf(str);

    }

    请问运行Test函数会有什么样的结果?

    答:可能是乱码。

    因为GetMemory返回的是指向栈内存的指针,该指针的地址不是NULL,但其原现的内容已经被清除,新内容不可知。

     

     

     

     

     

    void GetMemory2(char **p, int num)

    {

    *p = (char *)malloc(num);

    }

    void Test(void)

    {

    char *str = NULL;

    GetMemory(&str, 100);

    strcpy(str, "hello");

    printf(str);

    }

    请问运行Test函数会有什么样的结果?

    答:

    1)能够输出hello

    2)内存泄漏

     

     

     

     

     

     

    void Test(void)

    {

    char *str = (char *) malloc(100);

    strcpy(str, hello);

    free(str);

    if(str != NULL)

    {

    strcpy(str, world);

    printf(str);

    }

    }

    请问运行Test函数会有什么样的结果?

    答:篡改动态内存区的内容,后果难以预料,非常危险。

    因为free(str);之后,str成为野指针,

    if(str != NULL)语句不起作用。


    最新回复(0)