笔试 嵌入式Linux软件工程师 经常遇到的题目

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有多少位为10

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.保证mallocfree成对出现

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)

{

… /* 一系列针对的操作 */

}


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操作:S1;若S1后仍大于等于零,则进程继续执行;若S1后小于零,则进程阻塞

V操作:S1;若S1后大于零,则进程继续执行;若S1后小于等于零,则从该信号的等待队列中唤醒一个等待进程

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





  • 0
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值