1.编写一个函数,判断处理器是使用Big_endian模式(返回0)还是Little_endian模式(返回1)存储数据
int checkCPU() { union w { int a; char b; }c; c.a = 1; return (c.b == 1); }/*共用体的所有成员都是从地地址开始存放的.
2.判断单链表是否存在环形链表问题
bool IsLoop(node *head,node **start) { node *p1 = head, *p2 = head; if(head == NULL || head->next == NULL) { return false; } do { p1 = head->next; p2 = head->next->next; }while(p2 && p2->next && p1 != p2); if(p1 == p2) { *start = p1; return true; } else return false; }
3.计算一个无符号32位整型(unsigned int)的bit有多少位为1或0
int caculate_bit(unsigned int num) { unsigned int mask = 1 << 31; int n = 0; int i; for(i = 0; i < 32; i++) { if(num & mask) { n++; } num <<= 1; } return n; }
4.保证malloc和free成对出现
char * function(void) { char *p; p = (char *)malloc(…); if(p==NULL) …; … /* 一系列针对p 的操作 */ return p; }
在某处调用function(),用完function 中动态申请的内存后将其free,如下:
char *q = function();
…
free(q);
上述代码明显是不合理的,因为违反了malloc 和free 成对出现的原则,即"谁申请,就由谁释放"原则。不满足这个原则,会导致代码的耦合度增大,因为用户在调用function 函数时需要知道其内部细节!
正确的做法是在调用处申请内存,并传入function 函数,如下:
char *p=malloc(…);
if(p==NULL)
…;
function(p);
…
free(p);
p=NULL;
而函数function 则接收参数p,如下:
void function(char *p)
{
… /* 一系列针对p 的操作 */
}
6.编写一个函数实现求两个整数的最大公约数
int fuc(int a, int b) { if(a % b == 0) return b; return fuc(b, a % b); }
7.将对称的二维数组逆转
#define N 3 int i, j, a[N][N] = {1,2,3,4,5,6,7,8,9}; int temp; for (i = 0; i < N; i++) { for (j = i; j < N; j++) { if (i == j) continue; temp = a[i][j]; a[i][j] = a[j][i]; a[j][i] = temp; } }
8.冒泡排序和选择排序和插入排序
#define N 5 //冒泡排序 for ( i = 0; i < N - 1; i++) { for (j = 0; j < N - i - 1; j++) { if (a[j] > a[j + 1]) { temp = a[j]; a[j] = a[j + 1]; a[j + 1] = temp; } } } //选择排序 for ( i = 0; i < N - 1; i ++) { k = i; for (j = k + 1; j < N ; j++) { if (a[k] > a[j]) k = j; } temp = a[k]; a[k] = a[i]; a[i] = temp; } //插入排序 for (j = 1; j < N; j++) { key = a[j]; i = j - 1; while(i >= 0; && a[i] > key) { a[i + 1] = a[i]; i --; } a[i + 1] = key; }
9.字符串的链接函数(不能用系统自带的函数实现)
void string_strcat(char *dest, char * src) { char *p = dest;//记录头位置 while (*dest++); dest--; while(*dest++ = *src++); *dest = \'0'; }
10.用#define声明一个常数,用以表明一年中有多少秒
#define SECONDS_PER_YEAR (60 * 60 * 24 * 365)UL
11.关键字volatile有什么含义
定义为volatile的变量可能会被意想不到的改变,这样编译器就不会去假设这个变量的值,准确的说,优化器在用到volatile变量时候必须小心地重新读取该变量的值,而不是使用保存在寄存器的备份,用到volatile的三个例子
【1】并行设备的硬件寄存器(如:状态寄存器)。
【2】一个中断服务字程序中汇访问到的非自动变量。
【3】多线程应用中被几个任务共享的变量
12.多线程同步的方式
【1】临界区。通过对多线程的串行化来访问公共资源或一段代码,速度快,适合控制数据访问
【2】互斥量。为协同共同对一个共享资源的单独访问而设计的。
【3】信号量。为控制一个具有有限数量用户资源而设计的。
P操作:S减1;若S减1后仍大于等于零,则进程继续执行;若S减1后小于零,则进程阻塞
V操作:S加1;若S加1后大于零,则进程继续执行;若S减1后小于等于零,则从该信号的等待队列中唤醒一个等待进程
【4】事件。用来通知线程有一些事件已经发生,从开启动后继任务的开始。
13.函数指针问题
//改错1: //改为(在C或C++中): void GetMemory(char *p, int num) void GetMemory(char **p,int num) { { p = (char *)malloc(sizeof(char)*num); *p = (char *)malloc(sizeof(char)*num); } } void Test() void Test() { { char *str = NULL; char *str = NULL; GetMemory(str,100); GetMemory(&str,100); strcpy(str,"hello"); strcpy(str,"hello"); } } //或者改为(在C++中): void GetMemory(char *&p, int num) { p = (char *)malloc(sizeof(char)*num); } void Test() { char *str = NULL; GetMemory(str,100); strcpy(str,"hello"); } //改错2: //改为: char *GetString(void) void GetString(char *&p) //GetString(char **p) { { char p[] = "hello"; p = "hello"; //*p = "hello"; return p; } } void Test() void Test() { { char *str = NULL; char *str = NULL; str = GetString(); GetString(str);//GetString(&str) }