C/C++ 面试复习笔记(3)

article/2025/7/30 7:57:19

一.valgrind工具

参考:

内存检查工具valgrind介绍、安装与使用-CSDN博客https://blog.csdn.net/mijichui2153/article/details/85240349

二.C语言中如何实现一个线程池?

答案: 线程池是通过预先创建固定数量的线程来处理多个任务,避免频繁的线程创建和销毁。

解析: 线程池通常使用任务队列来存放待执行的任务,通过多个线程并发地执行任务。使用互斥锁、条件变量等机制来同步访问任务队列。

#include <pthread.h>
#include <queue>
​
struct ThreadPool{pthread_t *threads;std::queue<Task> tasks;pthread_mutex_t lock;pthread_cond_t cond;
};
​
void *worker(void* arg){while(true){pthread_mutex_lock(&lock);while(tasks.empty())pthread_cond_wait(&cond,&lock);Task task = task.front();tasks.pop();pthread_mutex_unlock(&lock);task.run();//执行任务}
}

三.C语言中如何实现一个动态哈希表(扩展哈希表)?

答案:动态哈希表会根据负载因子自动调整哈希表的大小,并重新哈希所有元素。

解析:当哈希表的负载因子达到一定阈值时,哈希表会扩大并重新哈希所有元素,以减少哈希冲突和提高查询效率。

四.C语言中如何实现一个单例模式(Singleton Pattern)?

答案: 单例模式保证一个类只有一个实例,并提供全局访问该实例的方法。

解析:单例模式通过静态变量和静态函数实现实例的惰性创建,并确保多次调用时只返回 一个实例。

五.strtok函数

char *strtok(char *str, const char *delim)

参数

  • str: 要分割的字符串。在第一次调用时,传入要分割的字符串;后续调用时,传入 NULL,表示继续分割同一个字符串。

  • delim: 分隔符字符串。strtok() 会根据这个字符串中的任意一个字符来分割 str

返回值

返回指向下一个标记的指针。如果没有更多的标记,则返回 NULL。

实例

#include <string.h>
#include <stdio.h>int main () {char str[80] = "This is - www.runoob.com - website";const char s[2] = "-";char *token;/* 获取第一个子字符串 */token = strtok(str, s);/* 继续获取其他的子字符串 */while( token != NULL ) {printf( "%s\n", token );token = strtok(NULL, s);}return(0);
}

注意事项

  1. 修改原字符串: strtok() 会修改传入的字符串,将分隔符替换为 \0(空字符)。因此,原始字符串会被破坏。

  2. 不可重入: strtok() 使用静态缓冲区来保存状态,因此它不是线程安全的。如果在多线程环境中使用,可以考虑使用 strtok_r()(可重入版本)。

  3. 连续分隔符: 如果字符串中有连续的分隔符,strtok() 会忽略它们,并返回下一个有效的标记。

可重入版本:strtok_r()

strtok_r() 是 strtok() 的可重入版本,它允许你在多线程环境中安全地使用。它的原型如下:

char *strtok_r(char *str, const char *delim, char **saveptr);
//char **saveptr是一个供内部使用的指针,用于保存上次分割剩下的字串。
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
​
int main()
{char pSrc[] = "this/is/jason;/i/am/from/xi'an/china";char* pToken = NULL;char* pSave = NULL;char* pDelimiter = "/";pToken = strtok_r(pSrc, pDelimiter, &pSave);printf("Begin:\n");while(pToken){printf("   pToken[%s]; pSave[%s]\n",pToken,pSave);pToken = strtok_r(NULL, pDelimiter, &pSave);}printf("End!\n");return 0;
}

其输出结果

Begin:pToken[this]; pSave[is/jason;/i/am/from/xi'an/china]pToken[is]; pSave[jason;/i/am/from/xi'an/china]pToken[jason;]; pSave[i/am/from/xi'an/china]pToken[i]; pSave[am/from/xi'an/china]pToken[am]; pSave[from/xi'an/china]pToken[from]; pSave[xi'an/china]pToken[xi'an]; pSave[china]pToken[china]; pSave[]
End!

六.C语言中如何实现一个带有缓存的数据库查询系统?

答案:通过使用缓存来存储常用查询的结果,以减少数据库的访问次数。可以采用LRU缓存策略,确保缓存中的数据为最近使用的数据。 解析:使用哈希表或者LRU缓存来存储查询结果,减少对数据库的频繁访问。

七.C语言中的memcpy函数的作用是什么?

答案:memcpy函数用于将源内存块中的内容复制到目标内存块中。

解析:memcpy是一种内存操作函数,用于按字节复制数据。使用时需要确保目标内存有 足够的空间,否则会导致内存溢出。

void *memcpy(void *str1, const void *str2, size_t n);

八. memmove() 和 memcpy() 的主要区别是什么?

memcpy() 不能处理内存重叠,直接拷贝可能会覆盖原数据。

memmove() 通过缓冲区确保数据不被破坏,适用于内存重叠情况。

memcpy() 不会自动添加 \0,仅拷贝指定字节数。

九.union易错点

union 的大小等于最大成员的大小向上取整到最大成员对齐值的整数倍。 (即:union_size = max(最大成员大小, 最大对齐值的整数倍)

十.C语言的存储类型

一般形式:

存储类型说明符 数据类型说明符 变量名,变量名...

在C语言中,对变量的存储类型说明有以下四种:

auto 自动变量 (动态存储)

register 寄存器变量(动态存储)

extern 外部变量(静态存储)

static 静态变量(静态存储)

所谓存储类型是指变量占用内存空间的方式,也称为存储方式。

1.auto 在函数体中定义的变量缺省是auto. 当进入代码块(block)时,系统为自动变量分配内存.在块内,这些变量被定义,并被认为他们是局部于本块的.当退出块时,系统释放分配给自动变量的内存,因此,变量值就丢失了.重新进入块,系统会为自动变量再次分配内存,原先的值已经没有了. 2.extern 在函数的外部声明变量,就为变量永久的分配存储,它的存储类型是extern. 定义在函数外部的变量的存储类型都是extern,既不使用关键字extern. 使用extern关键字是告诉,编译器”在本文件或其他文件中寻找它”.既a文件中int a =1在b文件中则可以使用extern int a;来调用它. 外部变量从不会消失,因为外部变量在整个程序执行期间都是存在的. 两种方式向函数传递信息:1.使用外部变量.2.使用参数.当函数从其内部而不是通过参数表改变全局变量时,会产生副作用.这样的构造容易引发错误.正确的做法是通过参数和返回机制影响全局变量.

3.register register高速编译器应该把有关的变量存储在高速的内存寄存器中.使用存储于类型register是要试图改善执行速度.当关系速度时,可选择一些最经常访问的变量,并把他们的存储类型声明为register. register i;等价于register int i;,register默认是int类型.

4.static 1.允许局部变量保存它的原有值,以便再进入块时使用. 当第一次调用函数时,把变量cnt初始化为0,在退出函数时,cnt的值被保存在内存中.当再次调用函数时,就不用再对cnt进行初始化,cnt扔保留着上次调用函数时的值. 2.在函数外部声明static,则次变量是本文件可访问(私有privacy),外部文件不能访问.

十一.题目:下面代码的输出是什么?

#include <stdio.h> 
int main() { int a = 10; printf("%d %d", a++, ++a); //未定义行为return 0; 
} 

序列点相关知识:序列点标志着一个执行点,在该点之前的所有副作用都会被处理完毕,之后的副作用才会开始。在 C 语言中,函数调用时参数的求值顺序是没有规定的,而且在函数调用(printf)前并没有序列点来明确副作用的执行顺序。

十二.在C语言中,printf和scanf函数的格式化字符串中,如果使用了错误的格式说明符,程序会产生编译错误。

答案: 错误

解析: printf 和scanf 的格式化字符串中使用错误的格式说明符不会导致编译错误,而 是会在运行时产生未定义行为或运行时错误。编译器不会检查这些格式符号是否与传入的参数类型匹配。

printfscanf 属于变参函数,也就是它们可以接收数量和类型都不固定的参数。在 C 语言中,编译器在编译阶段没办法对变参函数的参数类型进行完整的类型检查。所以,像下面这样的代码虽然在逻辑上是错误的,但编译器通常不会报错


http://www.hkcw.cn/article/SFtgocHRck.shtml

相关文章

Spring框架核心知识深度解析

Spring框架核心知识深度解析 最近正在复习Java八股&#xff0c;所以会将一些热门的八股问题&#xff0c;结合ai与自身理解写成博客便于记忆 今天将对spring常见问题做出解析 一、IOC与AOP核心原理 1. IOC&#xff08;控制反转&#xff09;详解 核心思想&#xff1a;将对象…

【第四十七周】HippoRAG 2 复现与分析(一):环境部署与代码分析

目录 摘要Abstract安装依赖试运行HippoRAG 初始化文档索引QA运行脚本 总结 摘要 本周对HippoRAG 2系统进行核心功能测试&#xff0c;通过构建小型结构化文档库&#xff08;如人物职业、童话事件、地理关系&#xff09;&#xff0c;验证其索引构建、动态增删、多轮检索问答及评…

【js逆向_AES】全国二手房指数数据爬取

目标&#xff1a;请求参数signcode&#xff0c;请求结果data。 网址&#xff1a;aHR0cDovL3d3dy5jY2hpbmRleC5jb20vSG9tZS9pbmRleA 查看载荷 查看响应数据 点击xhr&#xff0c;发现所有请求参数都是一个signCode&#xff0c;还是加密后的结果&#xff0c;对应结果中数据data也…

郑钦文社媒:人都应该有梦 刷新赛会最佳战绩

北京时间6月1日晚,在法网女单1/8决赛中,郑钦文战胜俄罗斯选手萨姆索诺娃,职业生涯首次跻身法网女单八强,刷新个人赛会最佳战绩。这也是中国选手时隔14年再次闯进法网八强。赛后,郑钦文在社交媒体上写道:“人都应该有梦,有梦就别怕痛,是一颗宝石就该闪烁。”她还祝所有的…

【第16届蓝桥杯 | 软件赛】CB组省赛第二场

个人主页&#xff1a;Guiat 归属专栏&#xff1a;算法竞赛 文章目录 A. 密密摆放&#xff08;5分填空题&#xff09;B. 脉冲强度之和&#xff08;5分填空题&#xff09;C. 25 之和D. 旗帜E. 数列差分F. 树上寻宝G. 翻转硬币H. 破解信息 正文 总共8道题。 A. 密密摆放&#xff0…

在线音乐服务器测试报告

1.项目背景 此项目主要用于模拟市面上主流的音乐软件的主要功能&#xff0c;提高自己的开发和测试能力。此项目采用的技术栈是SpringBoot MyBatis SpringMVC Mysql实现的&#xff0c;为了实现简单&#xff0c;方便测试&#xff0c;此项目没有注册功能&#xff0c;数据提前存…

球展世界,筑梦中原,2025郑州台球展会,年中招商即将开启

-壹肆柒2025中国&#xff08;郑州&#xff09;国际台球产业博览会暨全国台球产业链发展大会&#xff0c;将于2025年08月15-17日&#xff0c;在郑州中原国际会展中心盛大举办。本届博览会主题&#xff1a;同聚中原共赢未来&#xff0c;四个展馆&#xff0c;42000㎡的展览面积&am…

58、辣椒种植学习

辣椒&#xff08;学名&#xff1a;Capsicum annuum&#xff09;属于茄科辣椒属&#xff0c;是一种重要的蔬菜兼调味作物&#xff0c;具有较高的经济价值和营养价值。其果实富含维生素C、辣椒素等成分&#xff0c;既可鲜食&#xff0c;也可加工成干辣椒、辣椒粉、辣椒酱等产品&a…

SCSAI平台面向对象建模技术的设计与实现

一、核心设计思想 SCSAI平台的核心目标是通过元建模&#xff08;Meta-Modeling&#xff09;技术实现面向对象建模的零编码化。其核心思想为&#xff1a; 自反性设计&#xff1a;定义ObjectClassInfo (OCI)为元类&#xff08;Meta-Class&#xff09;&#xff0c;所有对象类均为…

三个细节 带你看懂中方在这届香会上的行动

这两天,谭主在第22届香格里拉对话会现场,参加了多场全体会议和平行会议。谭主在现场留意到三个细节,带你看懂中方在这届香会上的行动。细节一:中方提问美菲防长获东盟共鸣在昨天上午的第一场全体会议上,来自国防大学的张弛教授提问美国国防部长将如何处理美国联盟与东盟国…

UDP/TCP协议全解

目录 一. UDP协议 1.UDP协议概念 2.UDP数据报格式 3.UDP协议差错控制 二. TCP协议 1.TCP协议概念 2.三次握手与四次挥手 3.TCP报文段格式&#xff08;重点&#xff09; 4.流量控制 5.拥塞控制 一. UDP协议 1.UDP协议概念 当应用层的进程1要向进程2传输报文&#xff…

话题通信之python实现

在机器人操作系统&#xff08;ROS&#xff09;中&#xff0c;话题通信是一种常见的通信方式&#xff0c;它允许不同的节点之间通过主题进行数据交换。本文将介绍如何使用Python实现ROS话题通信&#xff0c;包括发布者和订阅者的编写。这种方法与使用C实现类似&#xff0c;但Pyt…

中国高分辨率高质量地面NO2数据集(2008-2023)

时间分辨率&#xff1a;日空间分辨率&#xff1a;1km - 10km共享方式&#xff1a;开放获取数据大小&#xff1a;15.36 GB数据时间范围&#xff1a;2008-01-01 — 2023-12-31元数据更新时间&#xff1a;2024-08-19 数据集摘要 ChinaHighNO2数据集是中国高分辨率高质量近地表空气…

射频通信概述

系列文章目录 提示&#xff1a;这里可以添加系列文章的所有文章的目录&#xff0c;目录需要自己手动添加 例如&#xff1a;第一章 Python 机器学习入门之pandas的使用 提示&#xff1a;写完文章后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目…

设置堆空间的最大值(-Xmx)应该要考虑哪些因素?

需要根据系统的配置来确定&#xff0c;要给操作系统和JVM其他内存区域&#xff08;栈、方法区&#xff09;留下一定的剩余空间。推荐配置系统或容器里可用内存的70%~80%最好。 假设物理内存是8G,设置多大堆内存比较合适&#xff1f; 系统有8G物理内存&#xff0c;系统自己可能会…

wordpress免费主题网站

这是一款WordPress主题&#xff0c;由jianzhanpress开发&#xff0c;可以免费下载。专为中小微企业设计&#xff0c;提供专业的网站建设、网站运营维护、网站托管和网站优化等服务。主题设计简约、现代&#xff0c;适合多种行业需求。 主要特点&#xff1a; 多样化展示&#…

SGLang 无法正常部署

1. 考虑 torch 版本 与 SGLang 不兼容&#xff1a; -> Python环境中的包被更新&#xff08;如torch, deepspeed, transformers等&#xff09;导致不兼容 - 参考&#xff1a;Exception: Capture CUDA graph failed: CUDA error: out of memory-CSDN博客 # 虽然锁定了 sg…

【拓扑排序】P6560 [SBCOI2020] 时光的流逝|普及+

本文涉及知识点 C图论 拓扑排序 P6560 [SBCOI2020] 时光的流逝 题目背景 时间一分一秒的过着&#xff0c;伴随着雪一同消融在了这个冬天&#xff0c; 或许&#xff0c;要是时光能停留在这一刻&#xff0c;该有多好啊。 … “这是…我在这个小镇的最后一个冬天了吧。” “嗯…

第13讲、Odoo 18 配置文件(odoo.conf)详细解读

1. 概述 Odoo 配置文件&#xff08;odoo.conf&#xff09;是管理 Odoo 服务器行为的核心工具&#xff0c;涵盖了网络、安全、数据库、性能等多方面的关键参数。本文档系统梳理 Odoo 18 配置文件的主要参数&#xff0c;结合实际应用场景&#xff0c;提供权威的配置建议与最佳实…

“大巴黎”欧冠夺冠引发法国多地骚乱

法甲球队巴黎圣日耳曼5月31日晚赢得欧冠联赛冠军奖杯,法国多地球迷彻夜庆祝。据法国内政部消息,狂欢夜有559人因滋事被捕,并发生两起命案。据法国媒体援引法国内政部等信源,在巴黎,一名20岁男子骑摩托车与汽车相撞,导致重伤不治身亡。在法国西南部城市达克斯,一名17岁未…