笔试面试题第一套总结

第一次笔试题总结:

7_11日:龙旗控股2015应届生招聘考试

 

1.windows 下32位机运行环境下:

char str[] = “wellcome to 51_c++”;

Int array[] = {1,2,3,4,5,6,7,8,9};

Char *p = str;

Int n;

Int func(int a[]);

 

Strlen(str) = 18;   strlen 不包括‘\0’;

Sizeof(str) = 19   sizeof 包括‘\0’;

Sizeof(array);     9*4 = 36;

Sizeof(p) = 4;//因为p是指针,所以大小为4

Sizeof(n)  = 4

Sizeof(a) = 4;   a[]  作为函数的形参时,会自动退化为同类型的指针

 

#include<iostream>
using namespace std;

void fun(char a[])
{
	cout<<sizeof(a)<<endl;
}
int main()
{
	char str[] = "Welcome to 51_C++";
	int Array[] = {1,2,3,4,5,6,7,8,9};

	char *p = str;
	int n;
	char  a[3];
	cout<<strlen(str)<<endl;//不包括\0  
	cout<<sizeof(str)<<endl;//包括\0
	cout<<sizeof(Array)<<endl;//36
	cout<<sizeof(p)<<endl;//4
	cout<<sizeof(n)<<endl;//4
	fun(a);//4
}



结果:





拓展:

#include<iostream>
using namespace std;

void fun(char a[])
{
	cout<<sizeof(a)<<endl;
}
int main()
{
	char str[10] = {'H','e','l','l','o'};
	cout<<sizeof(str)<<endl;//10
	cout<<strlen(str)<<endl;//5
	char str1[10] = {'H','e','0','l','0','l','o','0',};
	cout<<sizeof(str1)<<endl;//10
	cout<<strlen(str1)<<endl;//8
	char str3[10] = {'H','\0','l','\0','l','o'};
	cout<<sizeof(str3)<<endl;//10
	cout<<strlen(str3)<<endl;//1
	char str4[10];
	cout<<sizeof(str4)<<endl;//10
	cout<<strlen(str4)<<endl;//随机值
	
}


结果:





1.请观察下列程序运行时是否会出现问题,若有指出问题

#define MAX_SIZE 255

int main()

{

   unsigned char buf[MAX_SIZE+1];

   unsigned char i;

   for(i=0; i<=MAX_SIZE; ++i)

   {

   buf[i] = i;

   cout<<i<<endl;

   }

}

出现问题:死循环

for(i=0; i<=MAX_SIZE; ++i)//   i<=MAX_SIZE  的值永远为真,因为unsigned char 类型的范围为0~255 ,所以i 的值一直小于等于255,条件一直为真,就会出现死循环


1.添加下面的部分是为了给gui_show_image 这句代码的执行加上条件,请问这样修改有没有什么隐患?

 

 

 

gui_push_clip();

#ifdef AAA

     if(show_status == MMI_TRUE)

#endif

#ifdef BBB

 gui_show_image(x, y, image_id);

#endif

 gui_pop_clip();

 update_dt_display();

答:如果定义了AAA,也定义了BBB,则条件编译就可以达到对gui_show_image(x, y, image_id)

函数的限制作用,但是如果只定义了AAA,而没有定义BBB,那么条件限制的就是gui_pop_clip();但是这个函数本不应该受到条件的限制。

1.请问下面程序运行后会出现什么问题,该如何修改,另外从良好的编程角度看,那些地方需要修改?

 

 

void GetMemory(char *p)   

{

p = (char*)malloc(57);

}

 

void main()

{

char *str = NULL;

GetMemory(str);

strcpy(str, "51C++");

printf(str);

}

GetMemory  相当于值传递,因为是用形式参数的指针申请空间,实际参数并没有发生变化,str 也没有成功的申请到空间,  str  一直为NULL

 






char* GetMemory(void)

{

char p[] = "51 C++";

return p;

}

 

void main()

{

char *str = NULL;

str = GetMemory();

printf(str);

}

 



char p[] = "51 C++";

return p;

 

返回的是临时空间:内存是在内存栈中开辟空间的,这个空间在函数结束时就会自动被系统收回,所以return 语句不能返回指向栈内存的指针,程序可以运行,但是运行结果是随机值。



void  GetMemory(char **p)

{

*p = (char*)malloc(57);

}

 

void main()

{

char *str = NULL;

 GetMemory(&str);

strcpy(str,"51 C++");

printf(str);

}




程序可以运行,但是由于malloc 没有显式的对内存进行释放,所以会导致内存泄漏




void main()

{

char *str =(char*)malloc(57);

strcpy(str,"51 C++");

free(str);

if(str != NULL)

{

strcpy(str, "C++");

printf(str);

}

printf(str);

}



free(str);  只是释放了str所指的空间,并没有使str指向NULL,所以,str 将为野指针,if 语句对程序不起作用,

程序不会崩溃,但是str 的内容不可知

strcpy(str, "C++");

printf(str);

企图修改动态开辟内存中的数据,非常危险。

 

编程题:

1.请编码实现一个8bit 数据(unsigned char 类型)的指定位的置0 或者置 1 操作,并保持其他位不变

函数原型:void bit_set(unsigned char *p_data, unsigned char position, bool flag)


void bit_set(unsigned char *p_data, unsigned char position, bool flag)
{
	if(p_data == NULL)
		return;
	else
	{
		if(flag)
		{
			switch(position)
			{
			case 1:
				*p_data|=0x01;
				break;
			case 2:
				*p_data|=0x02;
				break;
			case 3:
				*p_data|=0x04;
				break;
			case 4:
				*p_data|=0x08;
				break;
			case 5:
				*p_data|=0x10;
				break;
			case 6:
				*p_data|=0x20;
				break;
			case 7:
				*p_data|=0x40;
				break;
			case 8:
				*p_data|=0x80;
				break;
			default:
				break;
			}
		}
		else
		{
			switch(position)
			{
			case 1:
				*p_data &= ~(0x01);
				break;
			case 2:
				*p_data&= ~(0x02);
				break;
			case 3:
				*p_data &= ~(0x04);
				break;
			case 4:
				*p_data &= ~(0x08);
				break;
			case 5:
				*p_data &= ~(0x10);
				break;
			case 6:
				*p_data &= ~(0x20);
				break;
			case 7:
				*p_data &= ~(0x40);
				break;
			case 8:
				*p_data &= ~(0x80);
				break;
			default:
				break;
			}
		}
	}

}
测试代码:

int main()
{
	unsigned char str = 'A';
	bit_set(&str, 7, false);
	cout<<(int)str<<endl;
}

第二种方法:

void bit_set(unsigned char *p_data, unsigned char position, bool flag)
{
	if(p_data == NULL)
		return;
	else
	{
		if(flag)
		*p_data |= 0x01<<(position-1);
		else
		*p_data &= ~(1<<position-1);
	}
}



1.请实现字符串右循环移位,比如:“abcdef”循环右移两位,就是efabcd

函数原型:

Void RightLoopMove(char *pStr, unsigned short steps)


void RightLoopMove(char *Pstr, unsigned short steps)
{
	int str_len = strlen(Pstr);
	steps = steps%strlen(Pstr);
	char *tmp = (char*)malloc(sizeof(char)*steps);
	strncpy(tmp, Pstr+(str_len-steps),steps);
	memcpy(Pstr+steps,Pstr,str_len-steps);
	memcpy(Pstr, tmp, steps);
}
牺牲空间
第二种方法:
void RightLoopMove(char *Pstr, unsigned short steps)
{
	char tmp;
	int str_len = strlen(Pstr);
	while(steps > 0 )
	{
		tmp = Pstr[str_len-1];
		for(int i=str_len-1; i>=0; --i)
		{
			Pstr[i] = Pstr[i-1];
		}
		Pstr[0] = tmp;
		--steps;	
	}

}
牺牲时间


 












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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值