奇梦者科技 C++开发 一面

1. 全局变量、局部变量、静态变量分别存在哪里,如果不初始化默认是什么值

答案:全局变量和静态变量如果是已初始化的,一般放在数据段;如果未显式初始化,通常放在 BSS 段。局部变量一般放在栈上,函数调用结束后生命周期就结束。static 修饰的局部变量,存储位置不在栈上,而是在静态存储区,只是作用域仍然限定在函数内部。默认初始化这块要分清楚:全局变量、静态变量、静态局部变量如果没有显式初始化,默认会被置为 0;普通局部变量如果没初始化,值是不确定的,直接用属于未定义行为。

代码:

#include <stdio.h>

int g1;           // BSS,默认 0
int g2 = 10;      // 数据段
static int s1;    // BSS,默认 0

void test() {
    int a;                // 栈上,未初始化,值不确定
    static int b;         // 静态存储区,默认 0
    printf("b = %d\n", b);
    b++;
}

int main() {
    printf("g1 = %d, g2 = %d, s1 = %d\n", g1, g2, s1);
    test();
    test();
    return 0;
}

2. 堆和栈的区别是什么

答案:栈通常由编译器和运行时自动管理,主要存函数调用现场、局部变量、返回地址,分配和释放都很快,但空间相对小。堆由程序员或内存分配器动态管理,适合生命周期不固定、大小运行期才能确定的数据,灵活性高,但分配释放开销更大,也更容易产生碎片和泄漏。栈上的数据生命周期跟作用域绑定,函数退出基本就没了;堆上的对象要靠 malloc/freenew/delete 主动管理。另外栈是向低地址还是高地址增长、堆如何扩展,这些是实现相关的,但常见系统里栈和堆是相向增长的。

代码:

#include <stdio.h>
#include <stdlib.h>

void func() {
    int x = 10;                  // 栈
    int *p = (int*)malloc(sizeof(int)); // 堆
    *p = 20;
    printf("%d %d\n", x, *p);
    free(p);
}

3. 除了堆和栈,进程地址空间里通常还有哪些区域

答案:一个进程的虚拟地址空间里通常不只有代码段、数据段、BSS、堆、栈,还会有共享库映射区、匿名映射区、只读常量区、内核空间映射等。代码段一般放程序指令,常量字符串通常在只读区。堆用于动态分配,栈用于函数调用。共享库比如 libc 会通过 mmap 映射到进程地址空间,文件映射、共享内存、大块内存分配也常常走映射区。如果再深一点,线程还会有各自独立的用户栈和线程局部存储区。

4. 哈希函数主要解决什么问题

哈希函数的核心作用是把一个范围很大的 key,映射成一个相对固定范围内的整数下标,方便快速存储和查找。它解决的不是“排序”问题,而是“如何尽量快地定位数据”问题。理想情况下,希望不同 key 经过哈希后分布尽量均匀,这样哈希表的插入、查找、删除平均复杂度可以做到 O(1)。但哈希函数不能避免冲突,只能尽量减少冲突,所以哈希表还要有冲突处理机制,比如拉链法、开放寻址法。如果哈希函数设计得很差,数据大量聚集到少数桶里,性能就会明显退化。

代码:

unsigned int hash(const char *s) {
    unsigned int h = 0;
    while (*s) {
        h = h * 131 + (unsigned char)(*s++);
    }
    return h;
}

5. 哈希冲突一般怎么处理,扩容时会发生什么

答案:哈希冲突指的是不同 key 经过哈希后映射到了同一个位置。常见处理方式有两类,一类是拉链法,也就是每个桶挂一个链表或者其他容器;另一类是开放寻址,比如线性探测、二次探测。工业里很多语言和库的哈希表会优先考虑拉链法或者拉链法的变种,因为删除和扩展更自然。当负载因子变高,冲突增多时,哈希表通常会扩容。扩容不是简单把数组变大,还要把原来所有元素重新计算桶位置,这个过程叫 rehash。所以平时说哈希表平均 O(1),前提是负载因子控制得当,哈希函数分布也比较均匀。

6. C 语言实现一个 value 为字符串的哈希表,怎么设计

用 C 实现哈希表,一般要先定义节点结构体,里面至少有 keyvalue 和冲突链指针。底层可以用桶数组加链表,也就是拉链法。查找时先算桶下标,再在链表里比较 key;插入时如果 key 已存在就更新,不存在就头插新节点。如果 value 是字符串,要注意内存所有权,不能直接拿外部临时指针乱存,通常要自己 strdup 或者手动申请空间复制。删除时除了摘链表,还要记得释放 key 和 value 对应的内存。

代码:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

#define TABLE_SIZE 101

typedef struct Node {
    char *key;
    char *value;
    struct Node *next;
} Node;

typedef struct {
    Node *buckets[TABLE_SIZE];
} HashTable;

unsigned int hash(const char *s) {
    unsigned int h = 0;
    while (*s) h = h * 131 + (unsigned char)(*s++);
    return h % TABLE_SIZE;
}

char *my_strdup(const char *s) {
    size_t n = strlen(s);
    char *p = (char*)malloc(n + 1);
    if (p) strcpy(p, s);
    return p;
}

void put(HashTable *ht, const char *key, const char

剩余60%内容,订阅专栏后可继续查看/也可单篇购买

C++ 常考面试题总结 文章被收录于专栏

本专栏系统梳理C++方向, 大中厂高频高频面试考点 , 内容皆来自真实面试经历,从基础语法、内存管理、STL与设计模式,到操作系统与项目实战,结合真实面试题深度解析,帮助开发者高效查漏补缺,提升技术理解与面试通过率,打造扎实的C++工程能力.

全部评论
感觉写的真的好
点赞 回复 分享
发布于 03-22 21:50 北京

相关推荐

04-01 17:56
已编辑
西安交通大学 算法工程师
先说结论&nbsp;笔试后没收到面试&nbsp;不一定是你没过&nbsp;很可能是卡在了你不知道的环节我投了30家公司&nbsp;做了18场笔试&nbsp;最后收到面试的只有5家&nbsp;剩下的要么石沉大海&nbsp;要么过了两三周才突然被捞起来后来我复盘了这些数据&nbsp;也问了几个大厂的HR&nbsp;总结出笔试后没进度的三个真实原因第一个原因&nbsp;流程卡在中间环节没人推进很多公司的流程是这样的&nbsp;笔试过了之后&nbsp;系统状态会变成待安排面试&nbsp;但这一步需要HR手动去排期&nbsp;如果负责你这条线的HR手上积压的人太多&nbsp;你的状态就会一直挂在那里&nbsp;没人通知你&nbsp;也没人告诉你下一步是什么&nbsp;我那次查进度才发现&nbsp;笔试通过的状态已经挂了整整两周&nbsp;就是没人安排第二个原因&nbsp;笔试成绩没过硬到被优先处理大厂笔试通常是分批进行的&nbsp;每批做完之后会按分数排序&nbsp;排名靠前的会优先安排面试&nbsp;中段的会进入备选池&nbsp;排名靠后的直接发感谢信&nbsp;如果你进了备选池&nbsp;就要等前面的人面完或者放弃&nbsp;才有机会被捞起来&nbsp;这就是为什么有些人等了两三周才突然收到面试第三个原因&nbsp;你投的岗位已经招满了但流程没关这种情况在春招后期特别常见&nbsp;岗位HC已经没了&nbsp;但笔试通道还开着&nbsp;你做完笔试之后系统显示进行中&nbsp;实际上已经没有面试名额了&nbsp;要等前面有人拒了offer才会轮到后面的知道了原因&nbsp;怎么解决&nbsp;我试过三个方法&nbsp;确实管用第一个方法&nbsp;主动查进度&nbsp;不要干等做完笔试一周后如果没消息&nbsp;直接去找内推人查系统状态&nbsp;没有内推人的就去官网招聘页面看有没有联系方式&nbsp;或者去牛客上搜同公司同岗位的进度贴&nbsp;看看别人走到哪一步了&nbsp;很多时候不是你没过&nbsp;而是状态卡住了&nbsp;主动问一句就能知道下一步该等还是该换方向第二个方法&nbsp;笔试之前或之后顺手做一件事&nbsp;加上HR的联系方式有些公司在笔试通知邮件里会留HR的邮箱或者群二维码&nbsp;看到就加一下&nbsp;笔试结束后过几天主动问一句&nbsp;笔试结果出来了吗&nbsp;大概什么时候安排面试&nbsp;这样既显得你积极&nbsp;也能提前知道自己的进度&nbsp;比你一个人焦虑地刷邮箱强多了第三个方法&nbsp;同时投递&nbsp;不要把希望押在一两家公司上从我的数据也能看出来&nbsp;三十家公司最后只有五家在一周内给了面试&nbsp;另外还有两家是两周以后才通知的&nbsp;如果把希望全押在那几家公司上&nbsp;中间这两周的等待会非常煎熬&nbsp;多投一些&nbsp;让面试通知错开时间&nbsp;心态会稳很多&nbsp;收到面试的概率也更大最后总结一下&nbsp;笔试后没消息&nbsp;大概率是这三种情况&nbsp;流程卡住了&nbsp;成绩在备选池&nbsp;或者岗位没HC了&nbsp;对应的解决办法就是主动查进度&nbsp;加上HR联系方式&nbsp;以及多投递分散风险没有消息不一定是你不行&nbsp;很多时候只是流程慢或者信息没同步&nbsp;主动去问&nbsp;比一个人焦虑有用
做完笔试后你收到面试了吗...
点赞 评论 收藏
分享
评论
点赞
3
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务