题型一:写一个宏定义一年有多少秒,忽略闰年
#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);
p是指向struct BBB型的指针,所以p+0x200就是 0x1000000 + sizeof(struct BBB)*0x200;
(就像int *p 跟char *p中的 p + 1 区别)(Ulong)p+0x200=
p被强制换成unsigned long 型的了,它不是指针了,所以这个就是普通的加法,像 1+1=2..(char*)p+0x200=
p被强制转换成指向char型的指针了,所以(char*)p+0x200 = 0x1000000 + 0x200*sizeof(char)
题型10 #include