c基础面试题

news/2024/10/8 19:58:02/

1.static和const的作用

static意为静态的,在C语言中可以修饰变量。如果是全局变量则只能在当前文件范围访问。

如果是函数内的局部变量则延长生命周期到整个程序。这意味着如果函数被多次调用,这个变量不会被重新初始化,而是保留上次调用结束时的值。

在C++中,static 还可以用于类成员,表示该成员是类的所有对象共享的,而不是每个对象独立拥有一份。静态成员可以在类外部定义,并且可以通过类名直接访问,而不需要创建类的实例。

const 意为常量,在C语言中修饰的常量在初始化后不能被修改 。在c++中可以将成员函数声明为 const,这表明该函数不会修改对象的状态。const 也可以用于类的对象,创建一个常量对象意味着该对象的所有成员(除非特别标记为 mutable)都不能被修改。

2.typedef和define的区别

typedef#define 都可以用来创建新的类型名称或者宏定义,但是typedef 用于给现有的类型起一个新的名字,这个新名字可以用于声明变量、函数等。#define 是在预处理阶段进行文本替换,不涉及类型检查。可以通过 #undef 指令来取消一个宏定义

3.volatile作用

用于告诉编译器某个变量可能会在程序的控制流之外被改变。这意味着编译器不应该对这个变量进行优化。适用于硬件寄存器,gpio端口,多线程,信号处理等情况。

4.sizeof和strlen区别

sizeof 是一个运算符,用于获取数据类型或变量在内存中所占的字节数。strlen 是一个标准库函数,用于计算以空字符 \0 结尾的字符串的实际长度。

5.数组和链表的区别

数组是一种线性数据结构,其中所有元素都存储在一块连续的内存空间中。

每个元素可以通过索引直接访问。随机读取时间复杂度为 O(1)。

数组的大小在创建时确定,一旦创建,大小不能改变。

数组中的所有元素必须是相同类型。

链表是一种线性数据结构,其中每个元素(节点)包含数据部分和一个指向下一个节点的指针。

链表中的节点可以分散存储在内存的任意位置。元素不必是不同类型,大小随时改变。

6.对指针的理解

指针是一个变量,记录了内存中的某个位置内存地址的编号,在64位系统中占8个字节,取值运算(*)、取址运算(&)

7.结构体和共用体区别

结构体是一种可以包含多种不同类型数据的集合。每个成员都有自己的内存空间,并且这些成员的内存空间是连续的。共用体是多个不同变量成员共享一个内存地址,一个共用体只能赋一个值,赋值后只能以赋值的类型读取才能读出正确的值。大小是其中最大的变量的大小。

8.结构体字节对齐

每个变量必须从自己大小的整倍数开始,不够就补齐。

结构体的大小必须是其中最大变量的整倍数。不够就补齐。

9.堆和栈的区别

栈是一种后进先出的数据结构

  • 内存分配和释放由编译器自动管理,通常通过函数调用和返回来实现
  • 分配和释放内存的操作非常快,因为只需要调整栈指针
  • 局部变量、函数参数和函数调用的上下文信息通常存储在栈上
  • 递归调用时,每次函数调用都会在栈上分配一个新的帧

堆是一种动态分配的内存区域

  • 堆上的数据的生命周期由程序员控制
  • 动态分配的内存需要显式地释放,否则会导致内存泄漏
  • 堆上的数据可以在函数调用之间保持存在
  • 内存分配和释放由程序员手动管理,通常通过 malloccallocrealloc 和 free 等函数来实现
  • 分配和释放内存的操作相对较慢,因为需要查找合适的内存块并进行管理

10.全局变量和局部变量的区别

全局变量通常存储在静态数据区,在程序启动时初始化,默认值为0,结束时销毁。可以被任何当前文件的函数访问。

局部变量存储在栈上,在函数启动时初始化,没有默认值,在函数结束时销毁。只能在当函数访问。

11.memcpy和strcpy的区别?

memcpy 用于复制内存块。它可以复制任意类型的数据,不仅仅是字符串。格式是

void *memcpy(void *dest, const void *src, size_t n);

strcpy 用于复制字符串。它只会复制到遇到第一个空字符(\0)为止。

12.什么是段错误?怎么解决段错误?

段错误通常发生在程序试图访问它不应该访问的内存区域时,通常发生在访问空指针/野指针,数组下标越界,程序占用栈内存过大,多线程同时修改同个内存时。

应该给指针赋初值避免野指针的出现。检查数组和字符串的边界,避免溢出。必要的话使用动态内存分配。使用互斥锁防止线程互相干扰。

13.什么是内存泄漏?什么是野指针?

内存泄漏是指程序在申请内存后,未能在不再需要这些内存时及时释放,导致这部分内存无法被再次使用。随着时间的推移,内存泄漏会逐渐累积。导致系统出问题。

野指针是指向已经释放或未初始化的内存的指针。调用野指针会导致程序或其他程序数据损坏。

14.数组指针和指针数组区别

数组指针是指向数组的指针,指针数组是多个指针组成的数组

int (*p)[5]是数组指针(*p)p是int*,相当于int a[5]的指针。

int* p[5]是指针数组,有5个指针p。

不知道为啥喜欢把*写在p前面。指针单独定义就不会混淆了(暴论)


http://www.ppmy.cn/news/1536269.html

相关文章

视频剪辑软件推荐电脑版:这5款剪辑软件不容错过!

在视频剪辑领域,选择合适的软件至关重要。不同的软件各有千秋,有的简单易用,适合新手快速上手;有的功能强大,适合专业团队进行深度编辑。以下是一些电脑版视频剪辑软件的推荐,涵盖了从新手到专业级别的不同…

大数据算法的思维

大数据算法的分类 一、分类算法 1. 决策树算法:通过构建树状结构,对数据进行分类。例如 ID3、C4.5 和 CART 算法,它们根据不同的特征选择标准进行分支划分,最终形成一颗能够对新数据进行分类的决策树。 2. 支持向量机&#xff08…

MySQL多表查询:列子查询

先看我的表数据 dept表 emp表 列子查询,也就是多列作为子查询去寻找一些问题 常用操作符:IN, NOT IN, ANY, SOME, ALL 1.查询 "销售部" 和 "市场部" 的所有员工的信息(拆分成以下两个问题) a. 查询"销…

Redis: 集群高可用之故障转移和集群迁移

故障转移 故障转移,包括自动故障转移和手动故障转移 1 )自动故障转移 Redis 集群,主节点挂了,从节点可以顶上来继续提供服务常用制造故障的两种方式 第一,对其中一个节点进行 SHUTDOWN 操作第二,kill 掉…

Redis: 主从复制读写分离环境搭建

概述 Redis 的单机模式实际上就是在一个服务器上装了一个单节点的Redis通过简单的配置和简单的命令启动起来就可以使用这种搭建环境,不保证高可用的情况下,完全没有问题如果说你的项目必须要具备高可用,而且 Redis 也要提供更高的性能这个单…

【开源免费】基于SpringBoot+Vue.JS微服务在线教育系统(JAVA毕业设计)

本文项目编号 T 060 ,文末自助获取源码 \color{red}{T060,文末自助获取源码} T060,文末自助获取源码 目录 一、系统介绍二、演示录屏三、启动教程四、功能截图五、文案资料5.1 选题背景5.2 国内外研究现状5.3 可行性分析 六、核心代码6.1 查…

前端推荐书单

‌HTML5‌ 《HTML5精粹》 《HTML5入门经典》 ‌《HTML5权威指南》‌ ‌《HTML5高级程序设计》‌ ‌《HTML5实战》,掌阅电子书,已读完,已记笔记95% 《HTML5揭秘》 《HTML5与CSS3权威指南》读20%,笔记20%‌ CSS3 《CSS3专业网页开发指…

Golang | Leetcode Golang题解之第452题用最少数量的箭引爆气球

题目&#xff1a; 题解&#xff1a; func findMinArrowShots(points [][]int) int {if len(points) 0 {return 0}sort.Slice(points, func(i, j int) bool { return points[i][1] < points[j][1] })maxRight : points[0][1]ans : 1for _, p : range points {if p[0] > …