c语言面试题目整理

news2024/11/15 13:52:01

1、static有什么用途?

在C语言中,static主要定义全局静态变量,定义局部静态变量,定义静态函数
限制变量的作用域,设置变量的存储域。

static 关键字主要有两种作用:
第一,为某特定数据类型或对象分配单一的存储空间,而与创建对象的个数无关。
第二,实现某个方法或属性与类而不是对象关联在一起,也就是说,在不创建对象的情况下就可以通过类来直接调用方法或使用类的属性。具体而言,在Java语言中,static 主要有 4 种使用情况:成员变量、成员方法、代码块和内部类。

定义全局静态变量 :在全局变量前面加上关键字static,该全局变量变成了全局静态变量。全局静态变量有以下特点:

(1) 在全局数据区内分配内存

(2) 如果没有初始化,其默认值为0

(3) 该变量在本文件内从定义开始到文件结束可见

定义局部静态变量:在局部静态变量前面加上关键字static,该局部变量便成了静态局部变量。静态局部变量有以下特点:

(1) 该变量在全局数据区分配内存

(2) 如果不显示初始化,那么将被隐式初始化为0

(3) 它始终驻留在全局数据区,直到程序运行结束

(4) 其作用域为局部作用域,当定义它的函数或语句块结束时,其作用域随之结束。

定义静态函数:在函数的返回类型加上static关键字,函数即被定义成静态函数。静态函数有以下特点:

(1) 静态函数只能在本源文件中使用

(2) 在文件作用域中声明的inline函数默认为static
说明:静态函数只是一个普通的全局函数,只不过受static限制,他只能在文件坐在的编译单位内使用,不能呢个在其他编译单位内使用。

C++语言中新增了两种作用:定义静态数据成员静态函数成员

(1) 定义静态数据成员。静态数据成员有如下特点:

内存分配:在程序的全局数据区分配

初始化和定义:静态数据成员定义时要分配空间,所以不能在类声明中定义

(2) 静态成员函数。静态成员函数与类相联系,不与类的对象相联系。静态成员函数不能访问非静态数据成员。原因很简单,非静态数据成员属于特定的类实例,主要用于对静态数据成员的操作。

静态成员函数和静态数据成员都没有this指针。

2、引用与指针的区别?

指针和引用

指针:指针就是内存地址,指针变量是用来存放内存地址的变量。不同类型的指针变量所占用的存储单元长度是相同的,而存放数据的变量因数据的类型不同,所占用的存储空间长度也不同。

引用:引用不是新定义一个变量,而是给已存在变量取一个别名,编译器不会为引用变量开辟内存空间,它和它引用的变量共用同一块内存空间.

类型& 引用变量名= 引用实体; 且引用类型必须和引用实体是同种类型的.

引用的主要用途是:修饰函数的形参和返回值.

在C++语言中,函数的参数和返回值的传递方式有三种:值传递,指针传递和引用传递.引用具有指针的效率,又具有变量使用的方便性和直观性.

实际上引用可以做的事,指针都可以做,为什么还要引用呢?

引用体现了最小特权原则,即给予程序元素完成其功能的最小权限. 指针能够毫无约束的操作内存中的任何东西,尽管功能强大,但是非常危险.

区别

1、初始化:引用在定义时必须初始化,指针则没有要求(尽量初始化,防止野指针)
2、引用在初始化引用一个实体后,就不能再引用其它实体,而指针可以在任意时候指向一个同类型实体
3、没有NULL引用,但是有nullptr指针
4、在sizeof中含义不同: 引用结果为引用类型的大小,但指针始终是地址空间,所占字节个数(32位平台占4个字节)
5、引用自加即引用的实体增加1,指针自加即指针向后偏移一个类型的大小
6、有多级指针,但没有多级引用
7、访问实体的方式不同:指针需要显式解引用,引用编译器自己处理
7、引用比指针使用起来相对安全

3、描述实时系统的基本特征

在特定时间内完成特定的任务,实时性和可靠性。

实时操作系统(RTOS) 是指当外界事件或数据产生时,能够接受并以足够快的速度予以处理,其处理的结果又能在规定的时间之内来控制生产过程或对处理系 统作出快速响应,并控制所有实时任务协调一致运行的操作系统。因而,提供及时响应和高可靠性是其主要特点。实时操作系统有硬实时和软实时之分,硬实时要求 在规定的时间内必须完成操作,这是在操作系统设计时保证的;软实时则只要按照任务的优先级,尽可能快地完成操作即可。我们通常使用的操作系统在经过一定改 变之后就可以变成实时操作系统。
分时操作系统使一台计算机同时为几个、几十个甚至几百个用户服务的一种操作系统。把计算机与许多终端用户连接起来,分时操作系统将系统处理机时间与内存空 间按一定的时间间隔,轮流地切换给各终端用户的程序使用。由于时间间隔很短,每个用户的感觉就像他独占计算机一样。分时操作系统的特点是可有效增加资源的 使用率。例如UNIX系统就采用剥夺式动态优先的CPU调度,有力地支持分时操作。

4、全局变量和局部变量在内存中是否有区别?什么区别?

全局变量存储在静态数据库,局部变量存储在栈。
局部变量(Local Variable):定义在函数体内部的变量,作用域仅限于函数体内部。离开函数体就会无效。再调用就是出错。
全局变量(Global Variable):定义:所有的函数外部定义的变量,它的作用域是整个程序,也就是所有的源文件,包括.c和.h文件。

5、什么是平衡二叉树?

左右子树都是平衡二叉树且左右子树的深度差值的绝对值不大于1.
在这里插入图片描述

6、栈溢出一般是由什么情况导致的?

没有回收垃圾资源。

堆栈工作方式:

堆栈是一个特定的存储区或寄存器,它的一端是固定的,另一端是浮动的 ,也就是所有操作均在堆栈顶端进行,遵循“先进后出”的特征。

原理说明:

2.1:堆区栈区内存分配原则

·栈顶的地址和栈的最大容量是由系统预先规定的,只要栈的剩余空间大于所申请空间,系统将为程序提供内存,否则将报异常来提示栈发生溢出。

·堆区是由程序员自己申请,指明大小,程序最后进行释放,若程序员不释放,程序结束时可能由操作系统回收(注意,如果是C/C++语言,程序不进行对空间回收,而Java语言中有专门的垃圾回收器进行回收)。

2.2:溢出原理:

    堆栈溢出是说堆区和栈区的溢出,二者同属于缓冲区溢出。从上面关于堆区和栈区的解释可以看出,一旦程序确定,堆栈内存空间的大小就是固定的,当数据已经把堆栈的空间占满时,再往里面存放数据就会超出容量,发生上溢;当堆栈中已经没有数据时,再取数据就无法取到了,发生下溢。

3.原因分析:

3.1:堆栈尺寸设置过小:

由堆栈溢出的定义便可知,堆栈尺寸设置过小时,其能储存的内容过小,容易发生溢出。

3.2:递归层次太深或函数调用层次过深导致堆栈溢出

函数递归调用时,系统要在栈中不断保存函数调用时的现场和产生的变量,如果递归调用太深,保存的调用现场和变量太多,当超过栈的空间长度时,即发生溢出就会造成栈溢出,这时递归无法返回。再有,当函数调用层次过深时也可能导致栈无法容纳这些调用的返回地址而造成栈溢出。

int A(int i)
{
 
    if(递归终止条件)
    {
        return 0;//中止递归
    }
    else
    {
        for()
        {
            A();//使用循环进行递归
        }
    }
}

这样的递归结构在for循环次数过多,且递归中止条件一直无法满足时,栈内存就会产生溢出。

int B (int j);
int A(int i)
{
    if(递归终止条件)
    {
        return 0;//中止递归
    }
    else
    {
        B();
    }
}
int B(int j)
{
    for()
    {
        A();
    }
}

对比两种结构,一种是不断递归,第二种是将循环部分放到另一个函数中,当程序进入B()函数后,A()函数就已经结束了,它占用的栈内存就可以得到释放,所以不会产生过多的函数嵌套。

3.3:动态申请空间使用之后没有释放。

    对于C语言,由于没有垃圾资源自动回收机制,因此,需要程序主动释放已经不再使用的动态地址空间,如果不释放,程序结束后该部分空间依然存在,还可以继续访问,也就是说这部分依然占据着堆空间,剩余的堆空间减少,就可能造成堆区溢出。

3.4:数组访问越界。

   C语言没有提供数组下标越界检查,如果在程序中出现数组下标访问超出数组范围,在运行过程中可能会内存访问错误。

3.5:指针非法访问。

指针保存了一个非法的地址,通过这样的指针访问所指向的地址时会产生内存访问错误。

总结:

堆栈溢出其实可以细分为堆溢出和栈溢出,在通常情况下会有如下情况(对应了前面讲的原因中的前三点,后两点为内存访问错误的情况):

1.堆溢出:不断的new 一个对象,一直创建新的对象,

2.栈溢出:死循环或者是递归太深,递归的原因,可能太大,也可能没有终止。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/399891.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

05 C语言数据类型

05 C语言数据类型 1、数据类型 编程语言对数据类型分为两派&#xff1a;一种认为要注重&#xff0c;一种认为可以忽视。 C语言类型 1、整数 : char < short < int < long < long long &#xff0c;bool 2、浮点数&#xff1a;float < double < long doub…

ChatGPT狂飙,文心一言会是李彦宏的“奇兵”吗?

“这是搜索领域新的一天。”前不久&#xff0c;微软CEO纳德拉在新版搜索引擎Bing的发布仪式上如此表示。Bing的技术支持&#xff0c;正是来自最近火遍全球的AI聊天机器人ChatGPT。仅仅两个月&#xff0c;OpenAI公司旗下的ChatGPT月活就超过1亿&#xff0c;成为史上增长最快的消…

Idea springboot springCloud热加载热调试常用的两种方式

场景描述 在项目开发的过程中&#xff0c;需要修改调试的时候偶每次都需要重启项目浪费时间&#xff0c;下面是我整理的两种常用的两种方式方式一 修改启动配置方式&#xff08;主要针对debug模式下&#xff09; 点击启动配置》edit configrations… configration下面修改Upd…

Win11+VS2019编译PCL1.12含gpu过程记录

之前直接用AllinOne安装了配置了一个pcl但是没有CUDA的支持&#xff0c;跑的速度很慢&#xff0c;现在想要集成到GPU上&#xff0c;需要重新编译一下PCL&#xff0c;之前自己编译一直有问题&#xff0c;而且还自己单独编译了相关的依赖库&#xff0c;结果发现只需要用AllinOne里…

《C++ Primer Plus》(第6版)第9章编程练习

《C Primer Plus》&#xff08;第6版&#xff09;第9章编程练习《C Primer Plus》&#xff08;第6版&#xff09;第9章编程练习1. 打印字符串2. 修改程序清单9.93. chaff4. sales《C Primer Plus》&#xff08;第6版&#xff09;第9章编程练习 1. 打印字符串 下面是一个头文件…

开源工具系列5:DependencyCheck

Dependency-Check 是 OWASP&#xff08;Open Web Application Security Project&#xff09;的一个实用开源程序&#xff0c;用于识别项目依赖项并检查是否存在任何已知的&#xff0c;公开披露的漏洞。 DependencyCheck 是什么 Dependency-Check 是 OWASP&#xff08;Open Web …

宿主机连接virtualbox中网络

背景&#xff1a;宿主机ubuntu&#xff0c;virtualbox中window中有VPN需要在宿主机也能共享到VPN网络。在virtualbox中添加host-only网络&#xff0c;取名vboxnet0这里在菜单栏中: 管理 -> 工具 -> network managervboxnet0在宿主的IP为192.168.56.1宿主机上运行ifconfig…

【Copula】基于二元Frank-Copula函数的风光出力场景生成方法【考虑风光出力的不确定性和相关性】(Matlab代码实现)

&#x1f4a5;&#x1f4a5;&#x1f49e;&#x1f49e;欢迎来到本博客❤️❤️&#x1f4a5;&#x1f4a5; &#x1f3c6;博主优势&#xff1a;&#x1f31e;&#x1f31e;&#x1f31e;博客内容尽量做到思维缜密&#xff0c;逻辑清晰&#xff0c;为了方便读者。 ⛳️座右铭&a…

JavaEE简单示例——依赖注入

简单介绍&#xff1a; 首先我们要知道&#xff0c;依赖注入就是赋值&#xff0c;带着这句话去理解依赖注入就非常的简单了&#xff0c;将文中所有的依赖注入全部脑部替换成给属性赋值&#xff0c;再去理解依赖注入的概念。 依赖注入&#xff08;DI&#xff09;是指IoC容器在运…

混淆矩阵的生成

混淆矩阵简介 混淆矩阵&#xff08;Confusion Matrix&#xff09;是一个二维表格&#xff0c;常用于评价分类模型的性能。在混淆矩阵中&#xff0c;每一列代表了预测值&#xff0c;每一行代表了真实值。因此&#xff0c;混淆矩阵中的每一个元素表示了一个样本被预测为某一类别…

Zabbix对接Prometheus实操——基于Prometheus pattern监控

概述 得益于对云原生和容器监控的友好支持&#xff0c;如今&#xff0c;Prometheus监控受到越来越多企业的青睐。然而&#xff0c;对于已经部署了Zabbix监控系统的企业&#xff0c;想要用Prometheus完全替换Zabbbix&#xff0c;可能既无必要&#xff0c;短期也不现实。实际上&…

Vue组件原理知识(1)

Vue 组件知识整理&#xff08;1&#xff09;文章目录Vue 组件知识整理&#xff08;1&#xff09;一、组件介绍1.1 传统方式与组件方式编写应用对比二、组件使用2.1 非单文件组件的使用**1. 组件的创建****2. 组件的注册****3. 组件的使用****4. Vue中使用组件的三大步骤总结***…

C++基础了解-20-C++类 对象

C 类 & 对象 一、C 类 & 对象 C 在 C 语言的基础上增加了面向对象编程&#xff0c;C 支持面向对象程序设计。类是 C 的核心特性&#xff0c;通常被称为用户定义的类型。 类用于指定对象的形式&#xff0c;它包含了数据表示法和用于处理数据的方法。类中的数据和方法…

Hadoop学习

1.分布式与集群 hosts文件&#xff1a; 域名映射文件 2.Linux常用命令 ls -a&#xff1a;查看当前目录下所有文件mkdir -p&#xff1a;如果没有对应的父文件夹&#xff0c;会自动创建rm -rf&#xff1a;-f&#xff1a;强制删除 -r&#xff1a;递归删除cp -r&#xff1a;复制文…

《统计学习方法》(李航)——学习笔记

第一章 概论统计学习&#xff0c;又称统计机器学习&#xff08;机器学习&#xff09;&#xff0c;现在提到的 机器学习 往往指的就是 统计机器学习。统计学习研究的对象是数据&#xff0c;其对数据的基本假设是同类数据存在一定的统计规律性&#xff0c;因此可以用概率统计方法…

KDJB-702三相工控微机继电保护测试仪

一、概述 KDJB-702三相继电保护校验仪搭载标准的4相电压3相电流输出&#xff0c;具有4相电压3相电流输出&#xff0c;可方便地进行各种组合输出进行各种类型保护试验。 二、功能特点 控制数字信号处理器微机 KDJB-702三相继电保护校验仪采用高速、高性能数字控制处理器作为控制…

前端基础(十六)_数组对象

数组对象 1、创建数组 // 字面量创建const arr [1, 2, 3, 4, 5, 6]// 构造函数创建const arr2 new Array(1, 2, 3, 4, 5, 6)const arr3 Array(1, 2, 3, 4, 5, 6)2.push (从数组末尾添加元素) a.数组.push(要添加进数组的数组项) b.作用&#xff1a;将要添加的数组项 添加到…

MyBatisX插件

引言MyBatisX一款基于 IDEA 的快速开发插件&#xff0c;为效率而生 1.在idea中下载MyBatisX插件安装重启就下载好了1.1MyBatisX中XML文件与mapper相对应好处&#xff1a;两个小鸽子点的话可以相互对应&#xff0c;方便我们在开发大项目的时候快速找到对应xml文件2.MyBatisX自动…

uniapp项目打包上线流程

平台&#xff1a;h5小程序app &#xff08;安卓&#xff09;小程序打包上线流程第一步&#xff1a;登录小程序公众平台第二步&#xff1a;hbuilderx打包小程序1.在mainfest.json文件中进行相关配置2.需要将项目中的网络请求改为https协议做为生产环境&#xff08;配置项目的环境…

spring cloud stream 自定义binder

背景xxx,关键字 binder stream &#xff0c;解决多中间件通信及切换问题直接主菜&#xff1a;spring cloud stream 架构中间件 --- binder --- channel --- sink --- &#xff08;处理&#xff09;---source ---channel ---binder ---中间件 springcloudstream已自己集成了kafk…