近期嵌软线下笔试题记录
1、以下代码的输出结果是?
#include <stdio.h>
#include <string.h>int main()
{int a,b,c,d;a = 10;b = a++; //a先赋值给b,然后自增1c = ++a; //a自增1后赋值给cd = 10*a++; //先进行运算然后a自增1printf("b,c,d:%d,%d,%d\n",b,c,d);//10 12 120printf("a:%d\n",a);//13system("pause");
}
b,c,d:10,12,120
a:13主要考察知识:前置++,后置++,运算符优先级
2、以下代码有什么问题?
#include <stdio.h>
#include <string.h>int main()
{char a;char *str = &a;strcpy(str,"hello");printf(str);system("pause");
}
导致内存访问错误,因为
char变量无法容纳整个字符串 "hello",可用数组实现拷贝。
3、请写出以下代码的输出内容:
#include <stdio.h>
#include <string.h>int main()
{char *c[] = {"ENTER","NEW","POINT","FIRST"};char **cp[] = {c+3,c+2,c+1,c};char ***cpp = cp;printf("%s\n",**++cpp);printf("%s\n",*__*++cpp+3);printf("%s\n",*cpp[-2]+3);printf("%s\n",*cpp[-1][-1]+1);system("pause");
}
这道题个人觉得有问题,只知道第一个输出为POINT,笔试的时候也是想了很久,回来后也用vs和ubuntu手敲的一遍,都编译错误。不知有无大佬知道这道题什么意思?
考察知识点:指针数组,二级指针,三级指针
4、指出下面代码里存在的所有问题,修正后输出结果是?
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
char* fun1(char* x){char y = 0;y = *x+1+*(x+2);return &y;
}
char* fun2(){static char a[8] = {0};strcpy(a,"a+b=");return a;}int main()
{char a[5] = {1,3,5,7,9};char *b = NULL,*str1,*str2;b = fun1(a);str1 = fun2();strcpy(str2,"hello word,");printf("%s%s%d",str2,str1,*b);system("pause");
}
存在的问题
fun1函数返回一个指向局部变量的指针。在fun1中,声明了一个字符变量y,并尝试返回它的地址。但是,一旦fun1函数执行完毕,y将会被销毁,因此返回的指针将指向无效的内存位置。你应该避免返回指向局部变量的指针。
str2是一个指针,但没有分配内存给它。在main函数中,你声明了str2但没有分配内存,然后尝试使用strcpy复制字符串到str2,这会导致未定义的行为。你应该分配足够的内存给str2,或者使用字符数组来存储字符串。
修改后的代码
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
char* fun1(char* x){static char y = 0;//用static来延长变量的生命周期y = *x+1+*(x+2);return &y;
}
char* fun2(){static char a[8] = {0};strcpy(a,"a+b=");return a;}int main()
{char a[5] = {1,3,5,7,9};char *b = NULL,*str1,*str2;//char *str1 = NULL;//char *str2 = NULL;b = fun1(a);str1 = fun2();str2 = malloc(12*sizeof(char));//为str2o动态分配内存strcpy(str2,"hello word,");printf("%s%s%d",str2,str1,*b);free(str2);system("pause");
}
总结起来,
str1不需要额外的内存分配,因为它返回的是指向静态数组的指针,而静态数组在整个程序的生命周期内都存在。而str2需要内存分配,因为你希望将字符串复制到一个动态分配的内存块中,这需要通过malloc或类似的函数来显式地分配内存。还有指针定义的时候要初始化,虽然上面代码str1和str2没有初始化也可以正常运行,但是还是希望大家进行初始化,否则可能出现野指针的情况。
5、实现memcpy函数,函数功能是将源地址内容拷贝到目的地址,并返回目的地址。
void *memcpy(void *dest,void *src,size_t n);
void *memcpy(void *dest,void *src,size_t n)
{char *d =(char *)dest;const char* s =(const char *)src;for(size_t i=0;i<n;i++){d[i] = s[i];//逐个字节进行拷贝}return dest;
}
6、实现memmove函数,与memcpy的区别是需要保证源地址目的地址存在重叠时仍然能够得到预期效果
void* memmove(void* dest,const void *src,size_t n);
void* my_memcpy(void* dest, const void* src, size_t n) {if (dest == NULL || src == NULL) {return NULL; // 处理空指针情况}unsigned char* d = (unsigned char*)dest;const unsigned char* s = (const unsigned char*)src;// 如果源地址和目标地址有重叠,从后往前拷贝if (d > s && d < s + n) {d += n - 1;s += n - 1;for (size_t i = 0; i < n; i++) {d[i] = s[i];}} else {for (size_t i = 0; i < n; i++) {d[i] = s[i];}}return dest;
}
7、实现一个函数,该函数的功能是判断当前机器是大端字节序还是小端字节序
int check_endianness() {unsigned int num = 1;unsigned char *ptr = (unsigned char *)#if (*ptr == 1) {return 1; // 小端字节序} else {return 0; // 大端字节序}
}
8、内存溢出一般是什么原因导致的?段错误是什么原因导致?
内存溢出是指程序试图分配的内存超过了系统或应用程序能够提供的可用内存。这可能导致程序崩溃、异常终止或不稳定的行为。内存溢出通常出现在以下几种情况:
动态内存分配不足 数据结构过大 资源泄漏
段错误(Segmentation Fault,通常缩写为 SegFault)是一种操作系统产生的错误信号,指示程序访问了其内存范围之外的区域。通常是由以下几种情况引起的:
访问无效指针 栈溢出 访问受保护的内存区域
9、全局变量和局部变量在内存分配的区别?
总之,全局变量在整个程序生命周期内存在,分配在静态数据区或全局数据区,而局部变量在函数调用期间存在,分配在栈内存中。选择何时使用全局变量或局部变量需要根据变量的作用范围、生命周期和内存管理等因素进行权衡。
10、gcc的编译过程
预处理-----编译-----汇编------链接
11、什么是互斥锁?什么是信号量?产生死锁的原因?
互斥锁(Mutex) 是一种同步机制,用于控制多个线程对共享资源的访问。它确保在任何给定时刻只有一个线程可以访问被保护的共享资源,从而防止多个线程同时修改同一数据而导致的竞态条件。
互斥锁的基本操作是两个:上锁(Lock) 和 解锁(Unlock)。当一个线程尝试上锁时,如果锁没有被其他线程占用,那么它可以获取锁并访问资源,否则它会被阻塞,直到锁被释放。解锁操作会释放锁,允许其他等待的线程获得锁。
信号量(Semaphore) 也是一种用于多线程同步的机制,但它可以管理多个线程对资源的访问。信号量维护一个计数器,表示可用资源的数量。当线程想要使用资源时,它会尝试获取信号量,如果计数器大于零,线程就可以继续执行,同时计数器减少;如果计数器为零,线程会被阻塞,直到有其他线程释放资源并增加计数器。
死锁 是一种多线程同步问题,指的是多个线程相互等待彼此持有的资源,导致所有线程都无法继续执行。
相关文章:
近期嵌软线下笔试题记录
1、以下代码的输出结果是? #include <stdio.h> #include <string.h>int main() {int a,b,c,d;a 10;b a; //a先赋值给b,然后自增1c a; //a自增1后赋值给cd 10*a; //先进行运算然后a自增1printf("b,c,d:%d…...
基于MYSQL的主从同步和读写分离
目录 一.完成MySQL主从同步(一主两从) 1.主库配置 2.建立同步账号 3.锁表设置只读 4.备份数据库数据 5.主库备份数据上传到从库 6.从库上还原备份 7.解锁 8.从库上设定主从同步 9.启动从库同步开关 10.检查状态 二.基于MySQL一主两从配置&…...
java八股文面试[多线程]——合适的线程数是多少
知识来源: 【并发与线程】 合适的线程数量是多少?CPU 核心数和线程数的关系?_哔哩哔哩_bilibili 【2023年面试】程序开多少线程合适_哔哩哔哩_bilibili...
Linux系统下vim常用命令
一、基础命令: v:可视模式 i:插入模式 esc:命令模式下 :q :退出 :wq :保存并退出 ZZ:保存并退出 :q! :不保存并强制退出二、在Esc下: dd : 删除当前行 yy:复制当前行 p:复制已粘贴的文本 u:撤销上一步 U:…...
【2023】LeetCode HOT 100——链表
目录 1. 相交链表1.1 C++实现1.2 Python实现1.3 时空分析2. 反转链表2.1 C++实现2.2 Python实现2.3 时空分析3. 回文链表3.1 C++实现3.2 Python实现3.3 时空分析4. 环形链表4.1 C++实现4.2 Python实现4.3 时空分析5. 环形链表 II5.1 C++实现5.2 Python实现...
智能井盖传感器,物联网智能井盖系统
随着城市人口的不断增加和城市化进程的不断推进,城市基础设施的安全和可靠性变得愈发重要,城市窨井盖作为城市基础设施重要组成部分之一,其安全性事关城市安全有序运行和居民生产生活安全保障。 近年来,各地都在加强城市窨井盖治理…...
C语言三子棋解析
目录(标2的是我自己写的一堆问题不知道怎么改) 开始菜单1打印棋盘1玩家下棋1电脑下棋1判断输赢1开始菜单2打印棋盘2选择先后2玩家下棋2电脑下棋2判断输赢2完整代码文件else.h文件else.c文件test.c 开始菜单1 void menu()//打印菜单 {printf("*****…...
【Jenkins打包服务,Dockerfile报错:manifest for java : 8 not fourd】
1、问题描述 Jenkins打包服务运行dockerfile里的FROM java:8报错manifest for java : 8 not fourd Caused by: com.spotify. docker.client.exceptions.DockerException: manifest for java:8 not found2、解决方法 在网上查找许多方法后得出这是由于Docker官方已经弃用java…...
读SQL学习指南(第3版)笔记06_连接和集合
1. 连接 1.1. 笛卡儿积 1.1.1. 交叉连接(cross join) 1.1.2. 查询并没有指定两个数据表应该如何连接,数据库服务器就生成了笛卡儿积 1.1.2.1. 两个数据表的所有排列组合 1.1.3. 很少会用到(至少不会特意用到) 1.…...
C#学习,结构,面向对象,类
结构和类 结构是从过程化程序设计中保留下来的一种数据类型,类则是面向对象程序设计中最基本的、也是最重要的概念。 结构 结构是一种值类型,通常用来封装一组相关的变量,结构中可以包含构造函数、变量、字段、方法、属性、运算符、事件和…...
【PHP】文件操作
文章目录 文件编程的必要性目录操作其它目录操作递归遍历目录PHP5常见文件操作函数PHP4常见文件操作函数其他文件操作函数 文件编程的必要性 文件编程指利用PHP代码针对文件(文件夹)进行增删改查操作。 在实际开发项目中,会有很多内容&…...
科创板50ETF期权交易:详细规则、费用、保证金和开户攻略
科创板50ETF期权是指以科创板50ETF为标的资产的期权合约。科创板50ETF是由交易所推出的一种交易型开放式指数基金(ETF),旨在跟踪科创板50指数的表现,下文介绍科创板50ETF期权交易:详细规则、费用、保证金和开户攻略&am…...
怎么把图片放大并且清晰?有详细的方法步骤
怎么把图片放大并且清晰?数字图像处理中的图片放大是许多行业和领域中广泛应用的一项技术。常规的放大方法通过插值或复制像素的方式增加像素数,但这会导致失真和模糊。无损放大是一种特殊的放大方法,它可以通过数学算法来增加图片的尺寸&…...
C++ 构造函数、析构函数调用虚函数
C虚函数是通过虚表实现的,虚函数的地址记录在需表中,只对象完成构造完成后,虚函数的地址才最终确定。 构造函数中调用虚函数 基类先于派生类构造,所以构造时没法调用到派生类的虚函数,也就是说只能调用到自己&#x…...
工业状态监测如何选择合适的无线技术?
工业领域的状态监测在提高生产效率和产品质量方面起着关键作用。过去依赖于预防性维护和例行检查的方式已经不再能满足日益复杂的生产需求,随着工业物联网(IIoT)的兴起,设备状态监测逐渐成为一种关键策略,催生了预测性…...
Mysql45讲学习笔记
前言:这篇文章主要总结事务,锁、索引的一些知识点,然后分享一下自己学习小心得,我会从点到线在到面展开说说,对于学习任何知识,我们都应该藐其全貌,不要一开始就选入细节 基础 一、基础架构&a…...
Neither the JAVA_HOME nor the JRE_HOME environment variable is defined
报错描述 情景一 1Panel在"主机-->进程守护"通过命令"nohup /opt/tomcat/bin/startup.sh > /opt/supersivor/tomcat/nohup.log &"创建守护进程,运行日志如下: #--------------------------------------------------------…...
opencv 水果识别+UI界面识别系统,可训练自定义的水果数据集
目录 一、实现和完整UI视频效果展示 主界面: 测试图片结果界面: 自定义图片结果界面: 二、原理介绍: 图像预处理 HOG特征提取算法 数据准备 SVM支持向量机算法 预测和评估 完整演示视频: 完整代码链接 一、…...
TypeScript数组和对象的操作
TypeScript数组和对象的操作 一、数组的声明二、数组初始化三、数组元素赋值、添加、更改四、删除五、合并、断开数组六、查找数组元素七、连接数组元素八、排序、反序数组九、遍历数组,对象 一、数组的声明 let arr1: Array<number>; let arr2: number[];二…...
docker之Compose与DockerSwarm
目录 Compose 简介 概念 为什么需要? 配置字段 常用命令 安装 1.下载 2.授权 使用 1.创建文件 2.启动 docker Swarm 关键概念 调度策略 spread binpack random 特性 集群部署 1.准备 2.创建swarm并添加节点 在主服务器上创建swarm集群 节点…...
【OSG学习笔记】Day 18: 碰撞检测与物理交互
物理引擎(Physics Engine) 物理引擎 是一种通过计算机模拟物理规律(如力学、碰撞、重力、流体动力学等)的软件工具或库。 它的核心目标是在虚拟环境中逼真地模拟物体的运动和交互,广泛应用于 游戏开发、动画制作、虚…...
循环冗余码校验CRC码 算法步骤+详细实例计算
通信过程:(白话解释) 我们将原始待发送的消息称为 M M M,依据发送接收消息双方约定的生成多项式 G ( x ) G(x) G(x)(意思就是 G ( x ) G(x) G(x) 是已知的)࿰…...
ssc377d修改flash分区大小
1、flash的分区默认分配16M、 / # df -h Filesystem Size Used Available Use% Mounted on /dev/root 1.9M 1.9M 0 100% / /dev/mtdblock4 3.0M...
基于服务器使用 apt 安装、配置 Nginx
🧾 一、查看可安装的 Nginx 版本 首先,你可以运行以下命令查看可用版本: apt-cache madison nginx-core输出示例: nginx-core | 1.18.0-6ubuntu14.6 | http://archive.ubuntu.com/ubuntu focal-updates/main amd64 Packages ng…...
成都鼎讯硬核科技!雷达目标与干扰模拟器,以卓越性能制胜电磁频谱战
在现代战争中,电磁频谱已成为继陆、海、空、天之后的 “第五维战场”,雷达作为电磁频谱领域的关键装备,其干扰与抗干扰能力的较量,直接影响着战争的胜负走向。由成都鼎讯科技匠心打造的雷达目标与干扰模拟器,凭借数字射…...
【HarmonyOS 5 开发速记】如何获取用户信息(头像/昵称/手机号)
1.获取 authorizationCode: 2.利用 authorizationCode 获取 accessToken:文档中心 3.获取手机:文档中心 4.获取昵称头像:文档中心 首先创建 request 若要获取手机号,scope必填 phone,permissions 必填 …...
推荐 github 项目:GeminiImageApp(图片生成方向,可以做一定的素材)
推荐 github 项目:GeminiImageApp(图片生成方向,可以做一定的素材) 这个项目能干嘛? 使用 gemini 2.0 的 api 和 google 其他的 api 来做衍生处理 简化和优化了文生图和图生图的行为(我的最主要) 并且有一些目标检测和切割(我用不到) 视频和 imagefx 因为没 a…...
掌握 HTTP 请求:理解 cURL GET 语法
cURL 是一个强大的命令行工具,用于发送 HTTP 请求和与 Web 服务器交互。在 Web 开发和测试中,cURL 经常用于发送 GET 请求来获取服务器资源。本文将详细介绍 cURL GET 请求的语法和使用方法。 一、cURL 基本概念 cURL 是 "Client URL" 的缩写…...
微服务通信安全:深入解析mTLS的原理与实践
🔥「炎码工坊」技术弹药已装填! 点击关注 → 解锁工业级干货【工具实测|项目避坑|源码燃烧指南】 一、引言:微服务时代的通信安全挑战 随着云原生和微服务架构的普及,服务间的通信安全成为系统设计的核心议题。传统的单体架构中&…...
WEB3全栈开发——面试专业技能点P4数据库
一、mysql2 原生驱动及其连接机制 概念介绍 mysql2 是 Node.js 环境中广泛使用的 MySQL 客户端库,基于 mysql 库改进而来,具有更好的性能、Promise 支持、流式查询、二进制数据处理能力等。 主要特点: 支持 Promise / async-await…...
