C语言经典面试题10道(二)

11.数组和链表的区别?

答案:
数组:数据顺序存储,固定大小;
链表:数据可以随机存储,大小可动态改变。

12.

void main()
{
    char aa[10];
    printf(“%d”,strlen(aa));
}                                          
会出现什么问题?打印结果是是多少?

答案:sizeof()和初不初始化没有关系,strlen()和初始化有关,打印结果值未知。

13.给定结构


struct A
{
    char t:4;
    char k:4;
    unsigned short i:8;
    unsigned long m;
}; 问sizeof(A) = ?

答案:8
详解:char t:4;是代表使用位域结构,表示使用char的其中四位,char k:4;刚好可以把剩下四位用掉(假如不够则要重新使用一个char),所以一共是char(1)+short(2)+long(4)=7,字节对齐(char和short占一个字节,long占一个字节)后为8。

14.

struct name1
{
    char str;
    short x;
    int num;
} ;求sizeof(name1)?


答案:8
详解:char(1)+short(2)+int(4)=7,字节对齐(char和short占一个字节,int占一个字节)后为8。

15.

struct name2
{
    char str;
    int num;
    short x;
}; 求sizeof(name2)?


答案:12
详解:char(1)占第一个字节中的1,第一个字节剩下3不够int(4),所以为了对齐,重新用一个字节,int(4)刚好占满这第二个字节,所以short(2)又要重新用一个字节(其实只用了前2),一共是4+4+4=12。

16.程序哪里有错误?


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

答案:申请p的时候没有初始化,所以p为野指针。

17.

(void *)ptr 和(*(void**))ptr 的结果是否相同?其中ptr为同一个指针。

答案:(void )ptr 和((void**))ptr 值是相同的
详解:个人理解,void前面的*是取该地址内容的,所以本质一样。

18.

要对绝对地址0x100000赋值,我们可以用(unsigned int*)0x100000 = 1234;那么要是想让程序跳转到绝对地址是0x100000去执行,应该怎么做?

答案:((void ()( ))0x100000 ) ( );首先要将0x100000强制转换成函数指针,即:
(void (*)())0x100000
然后再调用它:
((void ()())0x100000)();

19.关键字volatile有什么含意? 并给出三个不同的例子。


答案:一个定义为volatile的变量是说这变量可能会被意想不到地改变,这样,编译器就不会去假设这个变量的值了。精确地说就是,优化器在用到这个变量时必须每次都小心地重新读取这个变量的值,而不是使用保存在寄存器里的备份。下面是volatile变量的几个例子:
1). 并行设备的硬件寄存器(如:状态寄存器)
2). 一个中断服务子程序中会访问到的非自动变量(Non-automatic variables)
3). 多线程应用中被几个任务共享的变量

20.

嵌入式系统经常具有要求程序员去访问某特定的内存位置的特点。在某工程中,要求设置一绝对地址为0x67a9的整型变量的值为0xaa66。编译器是一个纯粹的ANSI编译器。写代码去完成这一任务。

答案:这一问题测试你是否知道为了访问一绝对地址把一个整型数强制转换(typecast )为一指针是合法的。这一问题的实现方式随着个人风格不同而不同。典型的类似代码如下:
int * ptr;
ptr= (int *)0x67a9;
*ptr = 0xaa66;