近期嵌软线下笔试题记录
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集群 节点…...

VS Code 使用 clang++ 编译,使用 cppvsdbg 或 lldb 调试的配置方法
需要安装的 VS Code LLVM VS Code 需要安装的插件: C/C(用来配置 c_cpp_properties.json) CodeLLDB(如果你要用 lldb 调试,那么这个插件就需要安装,用来连接到 lldb 调试器) 流程 我们都…...

android11,12 Launcher3编译什么
1首先看看手机里的是什么 adb shell pm path com.android.launcher3 package:/system_ext/priv-app/Launcher3QuickStep/Launcher3QuickStep.apk 然后就编译Launcher3QuickStep 2push apk 没什么说的,push到对应的文件夹 /system_ext/priv-app/Launcher3Quick…...

Go 第三方库引起的线上问题、如何在线线上环境进行调试定位问题以及golang开发中各种问题精华整理总结
Go 第三方库引起的线上问题、如何在线线上环境进行调试定位问题以及golang开发中各种问题精华整理总结。 01 前言 在使用 Go 语言进行 Web 开发时,我们往往会选择一些优秀的库来简化 HTTP 请求的处理。其中,go-resty 是一个被广泛使用的 HTTP 客户端。…...

【C语言】#define 宏定义初步使用
使用宏定义可以防止出错,提高可移植性,可读性,方便性等。 下面列举了一些成熟软件中常用的宏定义。 重新定义一些基本类型 重新定义一些类型,防止由于各种平台和编译器的不同,而产生的类型字节数差异,方便…...

项目里面怎么解决跨域的?
一.前端配置跨域 proxy解决跨域 在vue.config.js中通过proxy devServer中配置反向代理。 devServer: {port: port,open: true,overlay: {warnings: false,errors: true},// 配置反向代理proxy: {// 当地址中有/api的时候会触发代理机制/api: {target: http://ihrm-java.ithe…...

Oracle 批量导出表注释和主键
–查询分表(目前分了16张表) –先查询注释为空的表,也就是11表做示例,统计出来以后11批量修改成1 select owner,column_name,comments,table_name from all_col_comments a where a.table_name like ‘TB%1’ and a.comments is n…...

Linux C++ 海康摄像头获取过车信息
代码 void CALLBACK MessageCallback(LONG lCommand, NET_DVR_ALARMER *pAlarmer, char *pAlarmInfo, DWORD dwBufLen, void *pUser) {printf("enter MessageCallback---------------------->\n");int i;NET_DVR_ALARMINFO_V30 struAlarmInfo;memcpy(&struAl…...

iOS逆向:越狱及相关概念的介绍
在上一篇内容中我们介绍了App脱壳的技术,今天我们来介绍一个和iOS逆向密切相关的知识:越狱。 iOS操作系统的封闭性一直是开发者们关注的焦点之一。为了突破Apple的限制,越狱技术应运而生。本文将深入探讨iOS越狱,包括可越狱的版本…...

SQL语法与DDL语句的使用
文章目录 前言一、SQL通用语法二、DDL语句1、DDL功能介绍2、DDL语句对数据库操作(1)查询所有数据库(2)查询当前数据库(3)创建数据库(4)删除数据库(5)切换数据…...

Node.js /webpack DAY6
一、Node.js 入门 1. 什么是 Node.js? 2. 什么是前端工程化? 3. Node.js 为何能执行 JS? 4. Node.js 安装 5. 使用 Node.js 总结 6. fs 模块 - 读写文件 /*** 目标:基于 fs 模块 读写文件内容* 1. 加载 fs 模块对象* 2. 写入文件…...