曲径通幽论坛

 找回密码
 立即注册
搜索
查看: 5126|回复: 2
打印 上一主题 下一主题

C语言面试题大汇总之华为面试题

[复制链接]

4917

主题

5879

帖子

3万

积分

GROAD

曲径通幽,安觅芳踪。

Rank: 6Rank: 6

积分
34382
跳转到指定楼层
楼主
发表于 2008-11-16 22:49:11 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
1、局部变量能否和全局变量重名?
  
    答:能,局部会屏蔽全局。要用全局变量,需要使用"::"
  
    局部变量可以与全局变量同名,在函数内引用这个变量时,会用到同名的局部变量,而不会用到全局变量。对于有些编译器而言,在同一个函数内可以定义多个同名的局部变量,比如在两个循环体内都定义一个同名的局部变量,而那个局部变量的作用域就在那个循环体内。
  
    2、如何引用一个已经定义过的全局变量?
  
    答:extern
  
    可以用引用头文件的方式,也可以用extern关键字,如果用引用头文件方式来引用某个在头文件中声明的全局变量,假定你将那个变写错了,那么在编译期间会报错,如果你用extern方式引用时,假定你犯了同样的错误,那么在编译期间不会报错,而在连接期间报错。
  
    3、全局变量可不可以定义在可被多个.C文件包含的头文件中?为什么?
  
    答:可以,在不同的C文件中以static形式来声明同名全局变量。
  
    可以在不同的C文件中声明同名的全局变量,前提是其中只能有一个C文件中对此变量赋初值,此时连接不会出错
  
    4、语句for( ;1 ;)有什么问题?它是什么意思?
  
    答:和while(1)相同。
  
    5、do……while和while……do有什么区别?
  
    答:前一个循环一遍再判断,后一个判断以后再循环
  
    6、请写出下列代码的输出内容
  
    #include
    main()
    {
     int a,b,c,d;
     a=10;
     b=a++;
     c=++a;
     d=10*a++;
     printf("b,c,d:%d,%d,%d",b,c,d);
     return 0;
    }
  
    答:10,12,120
  
    7、static全局变量与普通的全局变量有什么区别?static局部变量和普通局部变量有什么区别?static函数与普通函数有什么区别?
  
    全局变量(外部变量)的说明之前再冠以static就构成了静态的全局变量。全局变量本身就是静态存储方式,静态全局变量当然也是静态存储方式。这两者在存储方式上并无不同。这两者的区别虽在于非静态全局变量的作用域是整个源程序,当一个源程序由多个源文件组成时,非静态的全局变量在各个源文件中都是有效的。 而静态全局变量则限制了其作用域,即只在定义该变量的源文件内有效,在同一源程序的其它源文件中不能使用它。由于静态全局变量的作用域局限于一个源文件内,只能为该源文件内的函数公用,因此可以避免在其它源文件中引起错误。
  
    从以上分析可以看出, 把局部变量改变为静态变量后是改变了它的存储方式即改变了它的生存期。把全局变量改变为静态变量后是改变了它的作用域, 限制了它的使用范围。
  
    static函数与普通函数作用域不同。仅在本文件。只在当前源文件中使用的函数应该说明为内部函数(static),内部函数应该在当前源文件中说明和定义。对于可在当前源文件以外使用的函数,应该在一个头文件中说明,要使用这些函数的源文件要包含这个头文件
  
    static全局变量与普通的全局变量有什么区别:static全局变量只初使化一次,防止在其他文件单元中被引用;
    static局部变量和普通局部变量有什么区别:static局部变量只被初始化一次,下一次依据上一次结果值;
    static函数与普通函数有什么区别:static函数在内存中只有一份,普通函数在每个被调用中维持一份拷贝
  
    8、程序的局部变量存在于(堆栈)中,全局变量存在于(静态区 )中,动态申请数据存在于( 堆)中。
  
    9、设有以下说明和定义:
  
    typedef union {long i; int k[5]; char c;} DATE;
    struct data { int cat; DATE cow; double dog;} too;
    DATE max;
  
    则语句 printf("%d",sizeof(struct date)+sizeof(max));的执行结果是:___52____
  
    答:DATE是一个union, 变量公用空间. 里面最大的变量类型是int[5], 占用20个字节. 所以它的大小是20
  data是一个struct, 每个变量分开占用空间. 依次为int4 + DATE20 + double8 = 32.
  所以结果是 20 + 32 = 52.
  
    当然...在某些16位编辑器下, int可能是2字节,那么结果是 int2 + DATE10 + double8 = 20
  
    10、队列和栈有什么区别?
    
    队列先进先出,栈后进先出
  
    11、写出下列代码的输出内容
  
    #include
    int inc(int a)
    {
     return(++a);
    }
    int multi(int*a,int*b,int*c)
    {
     return(*c=*a**b);
    }
    typedef int(FUNC1)(int in);
    typedef int(FUNC2) (int*,int*,int*);
  
    void show(FUNC2 fun,int arg1, int*arg2)
    {
     INCp=&inc;
     int temp =p(arg1);
     fun(&temp,&arg1, arg2);
     printf("%d\n",*arg2);
    }
  
    main()
    {
     int a;
     show(multi,10,&a);
     return 0;
    }
  
    答:110
  
    12、请找出下面代码中的所以错误
  
    说明:以下代码是把一个字符串倒序,如“abcd”倒序后变为“dcba”
  
    1、#include"string.h"
    2、main()
    3、{
    4、 char*src="hello,world";
    5、 char* dest=NULL;
    6、 int len=strlen(src);
    7、 dest=(char*)malloc(len);
    8、 char* d=dest;
    9、 char* s=src[len];
    10、 while(len--!=0)
    11、 d++=s--;
    12、 printf("%s",dest);
    13、 return 0;
    14、}
  
    答:
  
    方法1:
  
    int main()
    {
     char* src = "hello,world";
     int len = strlen(src);
     char* dest = (char*)malloc(len+1);//要为\0分配一个空间
     char* d = dest;
     char* s = &src[len-1];//指向最后一个字符
     while( len-- != 0 )
     *d++=*s--;
     *d = 0;//尾部要加\0
     printf("%s\n",dest);
     free(dest);// 使用完,应当释放空间,以免造成内存汇泄露
     return 0;
    }
  
  方法2:
  
    #include
    #include
    main()
    {
     char str[]="hello,world";
     int len=strlen(str);
     char t;
     for(int i=0; i
     {
      t=str;
      str=str[len-i-1]; str[len-i-1]=t;
     }
     printf("%s",str);
     return 0;
    }
  
    1.-1,2,7,28,,126请问28和126中间那个数是什么?为什么?
  
    第一题的答案应该是4^3-1=63
  
    规律是n^3-1(当n为偶数0,2,4)n^3+1(当n为奇数1,3,5)
  
    答案:63
  
    2.用两个栈实现一个队列的功能?要求给出算法和思路!
  
    设2个栈为A,B, 一开始均为空.
  
    入队:
    将新元素push入栈A;
  
    出队:
    (1)判断栈B是否为空;
    (2)如果不为空,则将栈A中所有元素依次pop出并push到栈B;
    (3)将栈B的栈顶元素pop出;
  
    这样实现的队列入队和出队的平摊复杂度都还是O(1), 比上面的几种方法要好。3.在c语言库函数中将一个字符转换成整型的函数是atool()吗,这个函数的原型是什么?
  
    函数名: atol
    功 能: 把字符串转换成长整型数
    用 法: long atol(const char *nptr);
    程序例:
    #include 
    #include 
    int main(void)
    {
     long l;
     char *str = "98765432";
     l = atol(lstr);
     printf("string = %s integer = %ld\n", str, l);
     return(0);
    }
  
    13.对于一个频繁使用的短小函数,在C语言中应用什么实现,在C++中应用什么实现?
  
    c用宏定义,c++用inline
   
    14.直接链接两个信令点的一组链路称作什么?
  
    PPP点到点连接
     
    15.接入网用的是什么接口?
    
    16.voip都用了那些协议?
  
    17.软件测试都有那些种类?
  
    黑盒:针对系统功能的测试   
    白合:测试函数功能,各函数接口
   
    18.确定模块的功能和模块的接口是在软件设计的那个队段完成的?
  
    概要设计阶段
   
    19.
    enum string
       {
     x1,
     x2,
     x3=10,
     x4,
     x5,
    }x;
  
    问x= 0x801005,0x8010f4  ;
   
    20.
    unsigned char *p1;
    unsigned long *p2;
    p1=(unsigned char *)0x801000;
    p2=(unsigned long *)0x810000;
  
    请问p1+5=  ;
      p2+5=  ;
  
    选择题:
   
    21.Ethternet链接到Internet用到以下那个协议?
   
    A.HDLC;B.ARP;C.UDP;D.TCP;E.ID
   
    22.属于网络层协议的是:
   
     A.TCP;B.IP;C.ICMP;D.X.25
   
    23.Windows消息调度机制是:
   
    A.指令队列;B.指令堆栈;C.消息队列;D.消息堆栈;
   
    24.
    unsigned short hash(unsigned short key)
    {
         return (key>>)%256
       }
    
    请问hash(16),hash(256)的值分别是:
  
     A.1.16;B.8.32;C.4.16;D.1.32
  
    找错题:
   
    25.请问下面程序有什么错误?
    
    int a[60][250][1000],i,j,k;
    for(k=0;k<=1000;k++)
    for(j=0;j<250;j++)
    for(i=0;i<60;i++)
    a[j][k]=0;
  
    把循环语句内外换一下
   
    26.
    #define Max_CB 500
    void LmiQueryCSmd(Struct MSgCB * pmsg)
    {
     unsigned char ucCmdNum;
     ......
        for(ucCmdNum=0;ucCmdNum
     {
      ......;
     }
  
     死循环
    
    27.以下是求一个数的平方的程序,请找出错误:
     
    #define SQUARE(a)((a)*(a))
    int a=5;
    int b;
    b=SQUARE(a++);
    
    28.
    typedef unsigned char BYTE
    int examply_fun(BYTE gt_len; BYTE *gt_code)
    { 
     BYTE *gt_buf;
     gt_buf=(BYTE *)MALLOC(Max_GT_Length);
     ......
     if(gt_len>Max_GT_Length)
     {
      return GT_Length_ERROR; 
     }
     .......
    }
  
    问答题:
    
    29.IP Phone的原理是什么?
  
    IPV6
    
    30.TCP/IP通信建立的过程怎样,端口有什么作用?
  
    三次握手,确定是哪个应用程序使用该协议
    
    31.1号信令和7号信令有什么区别,我国某前广泛使用的是那一种?
   
    32.列举5种以上的电话新业务?

4917

主题

5879

帖子

3万

积分

GROAD

曲径通幽,安觅芳踪。

Rank: 6Rank: 6

积分
34382
沙发
 楼主| 发表于 2009-7-26 02:50:20 | 只看该作者

使用 extern 声明

现在假定有一个 main.c 文件,其内容为:
#include <stdio.h>

int file1 = 12;
int main()
{
    printf("%d\\n",file1);   
    return 0;
}
还有一个 file1.c 文件,其内容为:
#include <stdio.h>

static int file1 = 10;

void file1_func()
{
    file1 = file1 + 1;
}
--------------------------------测试-1-------------------------------
编译文件并运行输出
beyes@linux-beyes:~/C/Exam/MultiFile> gcc -g main.c file1.c -o main.exe
beyes@linux-beyes:~/C/Exam/MultiFile> ./main.exe
12
编译通过,无错,运行输出得 12 。main.c 文件和 file1.c 文件中有一个同名的全局整型变量 file1。在 file1.c 中被初始化为 10,在 main.c 中被初始化为 12 。注意的是,file1.c 中的 file1 经过 static 声明后,对 main.c 来说是看不见了,所以 main.c 输出了自己的变量值 12 。

--------------------------------测试-2-------------------------------
但是,如果去掉 file1.c 中的 static 声明并保持变量的初始化会怎么样呢?

去掉后,再编译一下,结果编译出错了:
beyes@linux-beyes:~/C/Exam/MultiFile> gcc -g main.c file1.c -o main.exe
/tmp/ccEtJP6E.o:(.data+0x0): multiple definition of `file1'
/tmp/ccGuoh7O.o:(.data+0x0): first defined here
collect2: ld returned 1 exit status
提示说明,file1 被多重定义了。

--------------------------------测试-3-------------------------------
如果去掉 file1 中的初始化后( file1 = 10 ),再编译一次:
beyes@linux-beyes:~/C/Exam/MultiFile> gcc -g main.c file1.c -o main.exe
beyes@linux-beyes:~/C/Exam/MultiFile> ./main.exe
12
编译通过并输出 12 。

--------------------------------测试-4-------------------------------
如果保留 file.c 文件中的初始化( file1 = 10 ),而是去掉 main.c 中的初始化 (file1 = 12),那么再编译一下:
beyes@linux-beyes:~/C/Exam/MultiFile> gcc -g main.c file1.c -o main.exe
beyes@linux-beyes:~/C/Exam/MultiFile> ./main.exe
10
输出 10 ,用的是 file1.c 中的初始化值。

--------------------------------测试-5-------------------------------
如果在 main.c 中去掉 file1 的声明 (int file1; 去掉 ),那再编译一下:
beyes@linux-beyes:~/C/Exam/MultiFile> gcc -g main.c file1.c -o main.exe
main.c: In function ‘main’:
main.c:5: error: ‘file1’ undeclared (first use in this function)
main.c:5: error: (Each undeclared identifier is reported only once
main.c:5: error: for each function it appears in.)
提示未定义 file1 变量。

由上面可以看到,如果没有给变量赋值初始化,仅仅只是给这个变量划分了一个存储空间。虽然两个文件中都有相同名字的变量,谁被初始化就会用谁,而另外一个似乎是废弃掉了,实则不然 ---- 这两个在不同文件中声明的同名变量应该指的是同一个地址,也就是说,两个是同一个变量。通过修改一下 file1.c 和 main.c 文件再做一下试验:

fiel1.c
#include <stdio.h>
  
int file1 = 10;

void file1_func()
{
    file1 = file1 + 2;
    printf("file1_var_file1 = %d\\n", file1);
}

main.c
#include <stdio.h>
int file1;
int main()
{
    printf("%d\\n",file1);   
    file1 += 1;
    printf("%d\\n",file1);   
    file1_func();
    file1 += 1;
    printf("main_var_fiel1: %d\\n", file1);
    return 0;
}

编译运行输出
beyes@linux-beyes:~/C/Exam/MultiFile> ./main.exe
10
11
file1_var_file1 = 13
main_var_fiel1: 14
由输出看到,file1 值一直在变化,而不是“各自为政”,各有各的值。通过 gdb 调试程序,也可以看到,在调用 file1_func() 时,进入到函数中,通过查看 file1 的地址,发现在函数外的 file1 的地址为同一地址:
Breakpoint 1, main () at main.c:6
6        file1 += 1;
(gdb) p &file1
$1 = (int *) 0x804a014
...
file1_func () at file1.c:7
7        file1 = file1 + 2;
(gdb) s
8        printf("file1_var_file1 = %d\\n", file1);
(gdb) p &file1
$3 = (int *) 0x804a014

这就证明了不同文件中的相同的变量名实质上就是一个变量。这也就是为什么同时初始化时会出现多重定义的提示。

这样在不同的文件中重复的声明同一个全局变量没有必要,这只要在一个文件中定义,另外一个文件中用 extern 来声明即可,如在 file1.c 中对 file1 的定义:
int file1 = 10;
而要在 main.c 中引用,可以:
extern int file1;
这样,在连接时,链接程序自然会找到相关的定义。

4917

主题

5879

帖子

3万

积分

GROAD

曲径通幽,安觅芳踪。

Rank: 6Rank: 6

积分
34382
板凳
 楼主| 发表于 2009-7-26 23:07:45 | 只看该作者

在头文件中定义的全局变量

全局变量可不可以定义在可被多个 .c 文件包含的头文件中?

答:可以。如果 在不同的 .c 文件中以 static 形式来声明全局变量,那么相应的 .h 头文件中的全局变量也应是用 static 声明的,否则编译出错。

如有两个 .c 文件和一个 .h 文件:
test.h
static int muluse = 10;
main.c
#include <stdio.h>
#include "test.h"

static int muluse;
int main()
{
    printf("%d\\n",muluse);   
    muluse += 2;
    printf("%d\\n",muluse);   
   
    file2_func();
    return 0;
}

file2.c
#include <stdio.h>
#include "test.h"

static int muluse;
void file2_func()
{
    muluse += 1;
    printf("muluse = %d\\n",muluse);
}

编译运行
beyes@linux-beyes:~/C/Exam/MultiFile> gcc -g main.c file2.c -o main.exe
beyes@linux-beyes:~/C/Exam/MultiFile> ./main.exe
10
12
muluse = 11
由输出可见,由于用了 static ,所以各有各的值,互不影响。但两个 .c 文件中的 muluse 都会以 10 作为初始值。

如果头文件中已经声明 muluse 为 static int ,那么在两个 .c 文件中可以不用再次用 static int 来声明。

假如头文件中的 muluse 变量去掉 static ,而两个 .c 文件都直接使用这个变量,那么就会犯多重定义的错误:
beyes@linux-beyes:~/C/Exam/MultiFile> gcc -g main.c file2.c -o main.exe
/tmp/ccpEWPw8.o:(.data+0x0): multiple definition of `muluse'
/tmp/ccAO8px8.o:(.data+0x0): first defined here
collect2: ld returned 1 exit status

如果 .h 文件中,不使用 static 来声明变量,一个 .c 文件中却使用 static 来声明同名变量,同样会编译出错,编译提示:
beyes@linux-beyes:~/C/Exam/MultiFile> gcc -g main.c file2.c -o main.exe
file2.c:4: error: static declaration of ‘muluse’ follows non-static declaration
test.h:1: error: previous definition of ‘muluse’ was here
提示为,muluse 在非静态声明后(.h中)又跟着一个静态声明;
               在 test.h 中已经有一个 muluse 的定义。
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|曲径通幽 ( 琼ICP备11001422号-1|公安备案:46900502000207 )

GMT+8, 2024-5-13 18:13 , Processed in 0.081644 second(s), 22 queries .

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表