本文共 2504 字,大约阅读时间需要 8 分钟。
题型一:写一个宏定义一年有多少秒,忽略闰年
#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
题型六:不调用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)); //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