题一:
    
    char a[]={‘a’,‘b’,‘c’};char b[]={“abc”};数组a和数组 b 占用的内存空间大小不一样。请问这句话的说法是正确的吗?
    
    正确答案: A 你的答案: B (错误)
    
    正确
    
    错误
    
    解答:
    
    char b[]={“abc”}; 其实就是 char b[]=“abc”; 所以b占用的空间需要加上末尾的’\0’,长度为4.
   
    题二:
    
    若有以下程序
    
    struct st{ int n; struct st * nest; };
    
    struct st a[3]={ 5,&a[1],7,&a[2],9, ‘\0’ },*p;
    
    p=&a[0];
    
    则以下选项中值为6的表达式是
    
    正确答案: D 你的答案: C (错误)
    
    p->n
    
    (*p).n
    
    p->n++
    
    ++(p->n )
    
    解答:
    
    这里一定要注意C选项,->的优先级虽然高于++,但是表达式的值应该为5,输出后再执行++操作。一定要注意理解。
   
    题三:
    
    char p1[] = “Tencent”, void*p2 = malloc((10)在32位机器上sizeof(p1)和sizeof(p2)对应的值是?
    
    正确答案: C 你的答案: B (错误)
    
    8:0
    
    4:10
    
    8:4
    
    4:4
    
    解答:
    
    当参数分别如下时,sizeof返回的值表示的含义如下:
    
    数组——编译时分配的数组空间大小;
    
    指针——存储该指针所用的空间大小(存储该指针的地址的长度,是长整型,一般为4);
    
    类型——该类型所占的空间大小;
    
    对象——对象的实际占用空间大小;
    
    函数——函数的返回类型所占的空间大小。函数的返回类型不能是void。
    
    p1是数组,p2是指针。
   
    题四:
    
    关于c语言,下列说法正确的是()
    
    正确答案: C G 你的答案: E G (错误)
    
    结构只能包含一种数据类型
    
    可以比较两个联合是否相等
    
    结构的标记名是可以没有 的
    
    不同结构的成员必须有唯一的名字
    
    关键字typedef用来定义新的数据类型
    
    结构总是以传引用的方式传递给函数
    
    结构是不可以比较的
    
    解答:
    
    A选项明显错误
    
    B选项中,结构体和共用体变量都不能进行比较操作,因为类型不一样,无法比较,除非强制转换或重载比较运算符
    
    C选项中,如果想在一个地方定义结构体,而在其他地方定义实际的结构体变量那么就必须使用标记名;如果定义结构体的同时就创建该结构体变量,则可以省略结构体的标记名,此时该结构体是一次性的
    
    D选项明显错误
    
    E选项中,typedef不是用来定义新的数据类型,而是创建易于记忆的类型名,给类型取别名
    
    F选项中,结构总是以传值的方式传递给函数
    
    G选项明显正确
   
    题五:
    
    print函数声明为void print(int a,char b=‘b’,int c=1); 下面函数调用正确的是( )
    
    正确答案: A B C D 你的答案: C D (错误)
    
    print(‘a’);
    
    print(5,8);
    
    print(5,’#’);
    
    print(5,’#’,2);
    
    解答:
    
    函数声明时候参数初始化 可以不传参
    
    如果传参则覆盖 否则就是默认初始化值
   
    题六:
    
    阅读下面代码,程序会打印出来的值是?
    
    #include <stdio.h>
    
    void f(char**p){
    
    
    *p +=2;
    
    }
    
    main()
    
    {
    
    
    char *a[] = {“123”,“abc”,“456”},*
    
     p;
     
     p = a;
     
     f§;
     
     printf(“%s\r\n”,
     
      p);
      
      }
      
      正确答案: D 你的答案: C (错误)
      
      123
      
      abc
      
      456
      
      3
      
      解答:
      
      
       p+=2;就相当于
      
      p=
      
       p+2;
       
       其中
      
      p指向字符串“123”的第一个元素,即‘1’,指针p向后移两个元素的地址,即指向‘3’
      
      而
     
     (p+2)才是基于p每次向后移一个字符串的长度,即
    
    (p+2)指向“456”。
   
    题七:
    
    以下哪个函数可以在源地址和目的地址的位置任意的情况下,在源地址和目的地址的空间大小任意的情况下实现二进制代码块的复制?
    
    正确答案: B 你的答案: D (错误)
    
    memcpy()
    
    memmove()
    
    memset()
    
    strcpy()
    
    解答:
    
    memcpy与memmove的目的都是将N个字节的源内存地址的内容拷贝到目标内存地址中。
    
    但当源内存和目标内存存在重叠时,memcpy会出现错误,而memmove能正确地实施拷贝,但这也增加了一点点开销。
    
    所以选B
   
    题八:
    
    在函数调用过程中,如果函数funA调用了函数 funB,函数funB又调用了函数funA,则( )。
    
    正确答案: B 你的答案: D (错误)
    
    称为函数的直接递归调用
    
    称为函数的间接递归调用
    
    称为函数的循环调用
    
    C语言中不允许这样的递归调用
    
    解答:
    
    直接递归调用就是在函数a(或过程)中直接引用(调用)函数a本身
    
    间接递归调用就是在函数a(或过程)中调用另外一个函数b,而该函数b又引用(调用)了函数a
   
    题九:
    
    模式串的长度是m,主串的长度是n(m<n),使用KMP算法匹配的时间复杂度是()?
    
    正确答案: A 你的答案: B (错误)
    
    O(m+n)
    
    O(m∙n)
    
    O(m∙log2n)
    
    O(n∙log2m)
    
    解答:
    
    KMP为线性算法,处理主和匹配串的复杂度都为
    
    
    ),所以是
    
    
    ,选A
   
    题十:
    
    有如下程序段:
    
    #include
    
    void GetMemeory(char *p)
    
    {
    
    
    p = (char *)malloc(100);
    
    }
    
    void Test()
    
    {
    
    
    char *str = NULL;
    
    GetMemeory(str);
    
    strcpy(str, “Thunder”);
    
    strcat(str + 2, “Downloader”);
    
    printf(str);
    
    }
    
    请问运行Test函数结果是:
    
    正确答案: D 你的答案: B (错误)
    
    Thunder Downloader
    
    under Downloader
    
    Thunderownloader
    
    程序崩溃
    
    解答:
    
    1.参数是值传递,(p和str指向同一块地方NULL)
    
    2.但是函数又给参数p重新开辟空间,所以改变的是p指向的空间,str没变(还是指向NULL)。
    
    3.所以因为str没有空间存放字符串,导致崩溃
   
 
