C/C++面试题总结(1)

题型一:写一个宏定义一年有多少秒,忽略闰年

#define SECONDS_PER_YEAR (365*24*60*60UL)  

要点:
括号 – 宏定义
U – 无符号
L – 如果是16位机器将发生溢出

题型二:定义一个宏,返回两个数中较小者

#define min(x,y) ({           \
 const typeof(x) _x = (x);    \
 const typeof(y) _y = (y);    \
 (void) (&_x == &_y);         \
 _x < _y ? _x : _y;           \
})

演示程序
网上常见的答案是:

#define min(x,y) ((x)<(y)?(x):(y))

该种写法在极端调用的时候将产生副作用,如:min(x++,y++);

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

int *ptr;
ptr = (int *)0x67a9;
*ptr = 0xaa55

题型四:什么是回调函数?
这个问题网上有很多答案,但由于接触的少,理解的不是很深刻,故暂时不贴答案,周末时间好好分析一下

题型五:不调用API实现内存拷贝函数

void memcpy(void *dest, const void *src, size_t count)  
{  
    assert(dest != NULL); // 预防传入空指针 
    assert(src != NULL); 

    unsigned char *pdest = (unsigned char *)dst; // void*不能直接累加,需要类型转换  
    const unsigned char *psrc = (const unsigned char *)src;  


    assert(!(psrc<=pdst && pdst<psrc+count));//判断内存是否有重叠  
    assert(!(pdest<=psrc && psrc<pdest+count));  

    while(count--)  
    {  
        *pdest = *psrc;  
        pdest++;  
        psrc++;  
    }  
}

题型六:不调用API实现字符串拷贝函数(strcpy and strncpy)

char *strcpy(char *dest, const char *src)
{
    if((dest == NULL) || (src == NULL))
    {
        printf("ERROR:arg wrong\n");
        return NULL;
    }
    char *ret_string = dest;
    while(*src !='\0')
    {
        *dest = *src;
        dest++;
        src++;
    }
    *dest = '\0';
    return ret_string;
}

简化版(推荐):

char *strcpy(char *dest, const char *src)
{
    char *ret_string = dest;

    if((dest == NULL) || (src == NULL))
    {
        printf("arg wrong\n");
        return NULL;
    }
    while((*dest++ = *src++) != '\0');
    *dest = '\0';    
    return ret_string;
}
char* strcpy(char* dest; const char* src)
{
    assert((dest != NULL) && (src != NULL));  // <assert.h>
    char* ret_dest = dest;
    while((*dest++ = *src++) != '\0');
    *dest = '\0';
    return ret_dest;
}

题型七:如何实现线程同步(网友答案,还需要整理一下)?
1:用Interlocked系列函数实现线程同步;
2:用CRITICAL_SECTION及其系列函数实现线程同步;
3:用RTL_SRWLOCK及其系列函数实现线程同步;
4:用事件内核对象实现线程同步;
5:用信号量内核对象实现线程同步;

题型八:如何创建共享内存(网友答案,还需要理解一下,没用过)?
共享内存的实现分为两步:
1、创建共享内存,用到的函数是shmget();
2、映射共享内存,就是把这段创建的共享内存映射到具体的进程空间去,使用的函数是:shmat();

题型九:
4字节对齐的前提下,完成如下求解:

struct BBB
{
  long num;
  char *name;
  short int data;
  char ha;
  short ba[5];
}*p;
p=0x1000000;
p+0x200=____;
(Ulong)p+0x200=____;
(char*)p+0x200=____;
p+0x200= 0x1000000 + sizeof(struct BBB)*0x200;
(Ulong)p+0x200=0x1000000 + 0x200;
(char*)p+0x200= 0x1000000 + 0x200*sizeof(char);
  1. p是指向struct BBB型的指针,所以p+0x200就是 0x1000000 + sizeof(struct BBB)*0x200;
    (就像int *p 跟char *p中的 p + 1 区别)

  2. (Ulong)p+0x200=
    p被强制换成unsigned long 型的了,它不是指针了,所以这个就是普通的加法,像 1+1=2..

  3. (char*)p+0x200=
    p被强制转换成指向char型的指针了,所以(char*)p+0x200 = 0x1000000 + 0x200*sizeof(char)

题型10 #include

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值