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) }