华为笔试题.docx
《华为笔试题.docx》由会员分享,可在线阅读,更多相关《华为笔试题.docx(14页珍藏版)》请在冰点文库上搜索。
华为笔试题
一.用变量a给出下面的定义
1)一个整形数
2)一个指向整形数的指针
3)一个指向指针的指针,它指向的指针是指向一个整形数
4)一个有10个整形数的数组
5)一个有10个指针的数组,该指针是指向一个整形数的
6)一个指向有10个整形数数组的指针
7)一个指向函数的指针,该函数有一个整形参数并返回一个整形数
8)一个指向有10个指针的数组,该指针指向一个函数,该函数有一个整形函数并返回一个整形
二.说出static的作用
三.说出全局变量和静态全局变量的区别,并分别怎么使用
C语言面试题
1、局部变量能否和全局变量重名?
答:
能,局部会屏蔽全局。
要用全局变量,需要使用":
:
"
局部变量可以与全局变量同名,在函数内引用这个变量时,会用到同名的局部变量,而不会用到全局变量。
对于有些编译器而言,在同一个函数内可以定义多个同名的局部变量,比如在两个循环体内都定义一个同名的局部变量,而那个局部变量的作用域就在那个循环体内。
2、如何引用一个已经定义过的全局变量?
答:
extern
可以用引用头文件的方式,也可以用extern关键字,如果用引用头文件方式来引用某个在头文件中声明的全局变理,假定你将那个变写错了,那么在编译期间会报错,如果你用extern方式引用时,假定你犯了同样的错误,那么在编译期间不会报错,而在连接期间报错。
3、全局变量可不可以定义在可被多个.C文件包含的头文件中?
为什么?
答:
可以,在不同的C文件中以static形式来声明同名全局变量。
可以在不同的C文件中声明同名的全局变量,前提是其中只能有一个C文件中对此变量赋初值,此时连接不会出错
4、语句for(;1;)有什么问题?
它是什么意思?
5、do……while和while……do有什么区别?
1.找错
voidtest1()
{
charstring[10];
char*str1="0123456789";
strcpy(string,str1);
}
voidtest2()
{
charstring[10],str1[10];
for(intI=0;I<10;I++)
{
str1[I]='a';
}
strcpy(string,str1);
}
voidtest3(char*str1)
{
charstring[10];
if(strlen(str1)<=10)
{
strcpy(string,str1);
}
}
2.找错
#defineMAX_SRM256
DSNget_SRM_no()
{
staticintSRM_no;
intI;
for(I=0;I;i++)
{
SRM_no%=MAX_SRM;
if(MY_SRM.state==IDLE)
{
break;
}
}
if(I>=MAX_SRM)
return(NULL_SRM);
else
returnSRM_no;
}
3.写出程序运行结果
intsum(inta)
{
intc=0;
staticintb=3;
c+=1;
b+=2;
return(a+b+c);
}
voidmain()
{
intI;
inta=2;
for(I=0;I<5;I++)
{
printf("%d,",sum(a));
}
}
4.
intfunc(inta)
{
intb;
switch(a)
{
case1:
b=30;
case2:
b=20;
case3:
b=16;
default:
b=0;
}
returnb;
}
则func
(1)=?
5:
inta[3];
a[0]=0;a[1]=1;a[2]=2;
int*p,*q;
p=a;
q=&a[2];
则a[q-p]=?
6.
定义int**a[3][4],则变量占有的内存空间为:
_____
7.
编写一个函数,要求输入年月日时分秒,输出该年月日时分秒的下一秒。
如输入2004年12月31日23时59分59秒,则输出2005年1月1日0时0分0秒。
1.说出下面程序段的功能,并说出两段程序的优缺点.
程序段1:
intftest1(constchar*str){
charnum[256]={0};
unsignedchar*pos=(unsignedchar*)str;
while(*pos!
=0){
if(num[*pos]==0){
num[*pos++]=1;
}else{
break;
}
}
return*pos==0?
0:
1;
}
程序段2:
intftest2(constchar*str){
constchar*p1,*p2;
if(*str==0)
return0;
for(p1=str;*p1!
=0;p1++){
for(p2=p1+1;*p2!
=0;p2++){
if(*p1==*p2)
return1;
}
}
return0;
}
注:
提倡采用程序段2,本着易读原则;
2.写出运行结果
#include
#include
#include
intmain(intargc,char*argv[]){
chara[]="abc";
charb[]={'d','e','f'};
printf("aslen=%d,bslen=%d\n",strlen(a),strlen(b));
printf("a=%s,b=%s\n",a,b);
printf("asizelen=%d,bsizelen=%d\n",sizeof(a),sizeof(b));
return0;
\0
c
b
a
f
e
d
}
aslen=3,bslen=6
a
a=abc,b=defabc
asizelen=4,bsizelen=3
注:
栈分配原则:
从高地址->低地址分配;
b
4.说出错误
voidtest(){
charstr[10];
char*str1="0123456789";//allocintheonlyreaddataarea
strcpy(str,str1);//arrayindexoverflow
Strcpy(str1,str)//becausestr1allocedintheonlyreaddataarea
}
5.说出错误
voidtest(){
charstr[10],str1[10];
for(int=0;i<10;i++){//memset(str,0,sizeof(str))
//modifi<10-1
str[i]='a';
}
strcpy(str1,str);//findnotstringfileenddescripe
}
6.写出程序的运行结果
#include
intsum(inta){
staticintb=3;
b+=2;
return(a+b);
}
intmain(void){
inta=2;
inti;
for(i=0;i<5;i++){
printf("%d,",sum(a));
}
return0;
}
7.写出运行结果
#include
intmain(void){
inta[3];
a[0]=0;
a[1]=1;
a[2]=2;
int*p,*q;
p=a;
q=&a[2];
intc=a[q-p];
printf("valuec=%d\n",c++);
printf("valuec=%d\n",c);
return0;
}
valuec=2
valuec=3
8写出运行结果
#include
#include
#defineSTRCPY(a,b)strcpy(a##_p,#b)
#defineSTRCPY1(a,b)strcpy(a##_p,b##_p)
intmain(void){
charvar1_p[20];
charvar2_p[30];
strcpy(var1_p,"aaaa");
strcpy(var2_p,"bbbb");
STRCPY1(var1,var2);
STRCPY(var2,var1);
printf("var1=%s\n",var1_p);
printf("var2=%s\n",var2_p);
return0;
}
var1=bbbb
var2=var1
11.指出下面程序段的错误
voidteststr(char*p){
charstr[16];
intn;
assert(NULL!
=p);
sscanf(p,"%s%d",str,n);//n->&n
if(0==strcmp(str,"something")){
...
}
}
12.指出下面程序段的错误
voidtest2(){
charstring[10],str1[10];
inti;
for(i=0;i<10;i++){
str1[i]='a';
}
strcpy(string,str1);
}
错误:
数组越界;
解决方法:
方法一:
#defineSTR_LEN10
voidtest2(){
charstring[10],str1[10];
inti;
memset(str1,0,sizeof(str1));
for(i=0;istr1[i]='a';
}
strcpy(string,str1);
}
方法二:
#defineSTR_LEN10
voidtest2(){
charstring[10],str1[10];
inti;
for(i=0;istr1[i]='a';
}
str1[STR_LEN]=‘\0’;
strcpy(string,str1);
}
16.请指出下列程序中的错误并且修改
voidget_memory(char*p,intsize){
p=(char*)malloc(size);//piscopyerstr's
}
voidtest(void){
char*str=NULL;
get_memory(str,100);
strcpy(str,"helloworld");
printf(str);
}
A:
错误--参数的值改变后,不会传回
get_memory并不能传递动态内存,Test函数中的str一直都是NULL。
strcpy(str,"helloworld");将使程序崩溃。
修改如下:
方法一:
char*get_memory(intsize){
char*p=(char*)malloc(size);
returnp;
}
voidtest(void){
char*str=NULL;
str=get_memory(100);
strcpy(str,"helloworld");
printf(str);
}
方法二:
voidget_memory(char**p,intsize){
*p=(char*)malloc(size);
}
20.写下面sizeof的求值
A.32位为例,计算sizeof的值.
charstr[]="Hello";
char*p=str;
intn=10;
请计算
sizeof(str)=6//include'/0'
sizeof(p)=4
sizeof(n)=4
B.voidfunc(charstr[100]){
请计算
sizeof(str)=4
}
C.void*p=malloc(100);
请计算
sizeof(p)=4
D.structdate{
intyear;
intmonths;
intdays;
};
structdate*d;
请计算
d=malloc(sizeof(structdate));
sizeof(d)=4
sizeof(*d)=12