C/C++面试例题讲解

103 阅读3分钟

「这是我参与2022首次更文挑战的第16天,活动详情查看:2022首次更文挑战

  1. include “filename.h”’和include <filename.h>有什么区别?
    “filename.h”是从本项目里搜索filename.h,<filename.h> 是从标准库里搜索filename.h文件

  2. “静态全局变量”和“非静态全局变量”有什么区别?“静态局部变量”和“非静态局部变量”有什么区别?“静态函数”和“非静态函数”有什么区别?
    静态全局变量只在本文件中定义,其他文件不能引用.
    局部变量所在函数每次调用的时候都会被重新分配存储空间,函数结束后,就会回收该存储空间。静态局部变量不会,始终保持当前值。

  3. calloc 和 malloc 有什么区别?

calloc在动态分配完内存后,将内存空间置为零。malloc不初始化,里边数据是随机的脏数据。

  1. 在以下代码中,当构造 GuidedMissile 类型的对象时,以下哪个构造函数调用顺序是正确的?
    class Object {};
    class Projectile : public virtual Object {};
    class Guider : public virtual Object {};
    class Rocket :public Object {};
    class GuidedProjectile : public Projectile, public Guider {};
    class GuidedMissile : public GuidedProjectile, public Rocket {};
    Choices:
    a)Object, Projectile, Guider, Rocket, GuidedProjectile, GuidedMissile
    b)Object, Projectile, Object, Guider, Object, Rocket, Object, GuidedProjectile, Projectile, Guider, GuidedProjectile, Rocket, GuidedMissile
    c)Object, Object, Object, Projectile, Guider, Rocket, Projectile, Guider, GuidedProjectile, Projectile, Rocket, GuidedProjectile, Rocket, GuidedMissile
    d)Object, Projectile, Guider, GuidedProjectile, Object, Rocket, GuidedMissile
    a

  2. 请按时间复杂度对以下排序方法进行分类
    a) 快速排序;b) 冒泡排序;c) 归并排序;d) 堆排序;e) 插入排序

O(n^2):b、e
O(n*logn):a、c、d

  1. *int a[8]; /assume sizeof(int) = 4/
    int b;
    如何将数据复制到动态数组b?
    填以下空白?
    b = malloc(①);
    sizeof(a) --> ②
    sizeof(b) --> ③

①: sizeof(int)*8 ; ② 32字节 ; ③ 32字节 ;

  1. #define sum(a, b) a + b
    好吗?如果不是,如何纠正?
    可以改为#define sum(a, b) ((a)+(b))

  2. 给出变量“a”的以下定义
    a) An integer
    b) A pointer to an integer
    c) A pointer to a pointer to an integer
    d) An array of 10 integers
    e) An array of 10 pointers to integer
    f) A pointer to an array of 10 integers
    g) A pointer to a function that takes an integer as an argument and returns an integer
    h) An array of ten pointers to functions that take an integer argument and return an integer
    a) int a;
    b) int *a;
    c) int **a;
    d) int a[10];
    e) int *a[10];
    f) int (*a)[10];
    g) int (*a)(int);
    h) int (*a[10])(int);

  3. 以下函数的输出是什么?为什么?
    void foo(void)
    {
    unsigned int a = 6;
    int b = -20;
    (a+b > 6) ? puts("> 6") : puts("<= 6");
    }
    应该是>6,因为表达式中存在有符号类型和无符号类型,所有的数都自动转换为无符号类型。因此-20的代表的不再是负数,而是一个很大的数字,所以结果也变为很大的数。

  4. *假设:在4、32bit平台
    struct BBB {
    long num;
    char name;
    short int data;
    char ha;
    short ba[5];
    }p;

    p = 0x10000;
    p + 0x100 =0x11400;
    (Ulong)p + 0x100 = 0x10100;
    (char
    )p + 0x100 = 0x10100;

  5. 读C程序

void GetMemory(char *p)
{
p = (char *)malloc(100);
}
void Test(void)
{
char *str = NULL;
GetMemory(str);
strcpy(str, "hello world");
printf(str);
}
char *GetMemory(void)
{
char p[] = "hello world";
return p;
}
void Test(void)
{
char *str = NULL;
str = GetMemory();
printf(str);
}
Void GetMemory2(char **p, int num)
{
*p = (char *)malloc(num);
}
void Test(void)
{
char *str = NULL;
GetMemory(&str, 100);
strcpy(str, "hello");
printf(str);
}
void Test(void)
{
char *str = (char *) malloc(100);
strcpy(str, “hello”);
free(str);
if(str != NULL)
{
strcpy(str, “world”);
printf(str);
}
}

上面运行测试功能时的每个结果是什么。

1.会崩溃。
2.乱码
3.能够输出hello
4.str的动态内存已经被释放

  1. C 编程
    实现一个函数“revstr()”,不允许使用任何C标准库函数,定义函数原型,返回输入字符串的反转。
char *revstr(char *str, size_t len)
{
    char    *start = str;
    char    *end = str + len - 1;
    char    ch;
    if (str != NULL)
    {
        while (start < end)
        {
       ch = start;
end=ch;
start=end;
       *start++;
*end--;     
   }
 }
    return str;
}

这里知识帮大家总结一下,有什么错误的地方欢迎指正。