笔试面试题第一套总结
2017-07-14 17:06
627 查看
第一次笔试题总结:
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[] 作为函数的形参时,会自动退化为同类型的指针
结果:
结果:
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)
第二种方法:
1.请实现字符串右循环移位,比如:“abcdef”循环右移两位,就是efabcd
函数原型:
Void RightLoopMove(char *pStr, unsigned short steps)
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; } } 牺牲时间
相关文章推荐
- 二叉树类型笔试面试题大总结(含代码)
- C++的一些笔试面试题总结
- 面试题、笔试题总结
- 【找工作】笔试面试题总结——多益网络面试题(人工智能岗)
- 【不定期更新】FPGA/IC岗位常见笔试面试题总结
- 笔试面试题总结之单链表(Linked List)
- android面试题笔试题总结
- Linux笔试面试题总结
- 数据库常见笔试、面试题总结
- 安全公司笔试面试题总结
- 实习生笔试面试题总结
- 安全公司笔试面试题总结
- 嵌入式软件常见笔试面试题总结
- BAT及各大互联网公司前端笔试面试题--Html,Css篇(加上自我整理总结哟)
- 笔试面试题总结(四)--- 软件开发
- 二叉树类型笔试面试题大总结(含代码)
- 嵌入式软件常见笔试面试题总结 .
- 总结手游客户端笔试面试题(Cocos2dx客户端、C/C++、lua、数据结构算法等)
- 二叉树类型笔试面试题大总结(含代码)
- IT公司笔试面试题总结