当前位置: 首页 > news >正文

c/c++面试100道

1.一道笔试题解析_哔哩哔哩_bilibili

P20:#define offsetof(TYPE, MEMBER) ((size_t)&((TYPE*)0)->MEMBER)

1、

offsetof 宏是 C 语言中用于计算结构体成员相对于结构体起始地址的偏移量的宏定义。这个宏的定义如下:

#define offsetof(TYPE, MEMBER) ((size_t)&((TYPE*)0)->MEMBER)

这个宏定义的工作原理如下:

  1. TYPE* 是一个指向 TYPE 结构体的指针。
  2. (TYPE*)0 将整数 0 转换为 TYPE 类型的指针。这里 0 是一个空指针常量,转换成 TYPE 类型的指针后,它指向的是结构体的起始地址。
  3. ((TYPE*)0)->MEMBER 使用箭头操作符 -> 访问结构体的成员 MEMBER。由于 TYPE* 指针指向地址 0,这实际上是在计算 MEMBER 在 TYPE 结构体中的偏移量。
  4. (size_t)&((TYPE*)0)->MEMBER 取 MEMBER 成员的地址并强制转换为 size_t 类型,这样得出的就是 MEMBER 相对于结构体起始地址的偏移量。

通过这个宏,你可以在运行时获取结构体成员的偏移量,这对于编写低级代码或者处理结构体布局非常有用。

size_t:

size_t 是一种无符号整数类型,用于表示对象的大小和内存地址。它是标准 C 库中的一种类型,size_t 的大小取决于平台的架构(32 位或 64 位),并且它能存储最大的内存地址值,因此它通常与平台的指针大小匹配。在 32 位系统中,size_t 通常是 4 字节(32 位),在 64 位系统中,通常是 8 字节(64 位)。

X86和X64的区别:

X86指的是支持32位的指令集架构处理器,最初由英特尔在1978年发布的 intel 8086,这个系统主要为X86结尾所以简称X86,而X86有16位和32位,现今大多数用的是32位处理器。

X64指的是支持64位的指令集架构处理器,最初由AMD在2003年发布的AMD 64 支持64位的处理器由来,后续英特尔为了支持X64所以也推出 intel X64。

联合体和结构都要做数据对齐,对齐的位数取决于系统是32位还是64位

32位默认操作的最小单元是4个字节,64位默认操作的最小单元是8个字节

这里在代码前加上#pragma pack(4)  

可以实现强制4字节对齐

P21:const

在c中也可以这样间接的修改const变量的值

用const修饰形参的时候,不能更改它修饰的值:

以下函数定义是会报错的

P22:fork()

#include <stdio.h>
#include <unistd.h>

int main() {
    fork() || fork();
    printf("Hello ");
    return 0;
}

分析:
最初的进程(P0)调用第一个fork()。这会创建一个子进程(P1)。

P0: 第一个fork()返回非0(父进程的返回值),所以fork()的结果为真,fork()后的第二个fork()不会执行。
P1: 第一个fork()返回0(子进程的返回值),所以fork()后的第二个fork()会执行。
P1调用第二个fork(),创建另一个子进程(P2)。

P1: 第二个fork()的结果返回非0,执行printf("Hello ")。
P2: 第二个fork()返回0,执行printf("Hello ")。
总结
P0: 执行printf("Hello ")。
P1: 执行printf("Hello ")。
P2: 执行printf("Hello ")。
总共有3个进程执行printf("Hello "),所以最终输出"Hello "三次。

P23:指针引用

P24:调用几次构造函数

C++中的class的应用_c++ class用法-CSDN博客

疑问:C++的string类 和 class的关系是什么?

答疑:C++的string类和class的关系在于string是一个具体的类,而class是定义类的关键字。string类是C++标准库中的一部分,它是一个封装了字符串操作的类,提供了许多功能,比如动态管理字符串内存、字符串拼接、查找等。而class是用来定义自定义类型的工具,可以用来创建自己的类,包括string这样已有的类。简单来说,string是通过class定义的。

疑问:C++中struct和class的区别

有一点特殊的是,当class定义时,如果没有string name这种复杂的定义则其他简单定义就不会初始化

题目:

这里MyClass a[4] 创建了4个类的对象,所以执行了四次构造函数

这里MyClass *p[5] 创建了5个指向类的对象的指针,因为只是指向类对象的指针所以并没有创建对象,所以不会执行构造函数

P25:求二进制值中1的个数

P26:判断一个数是否是2的n次方


http://www.mrgr.cn/news/22122.html

相关文章:

  • 心觉:潜意识是一个免费的“超级工作狂”,你居然不会用
  • IP包头的总长度字段和UDP包头的长度字段之间的关系
  • 数据结构(邓俊辉)学习笔记】排序 6——希尔排序:框架 + 实例
  • 738. 单调递增的数字
  • vue组件间通信
  • 基于SpringBoot框架和Flask的图片差异检测与展示系统
  • js事件冒泡和事件委托
  • C++异常
  • Java高级编程—网络编程(完整详解,包括UDP通信方式、TCP通信方式、TCP三次握手、TCP四次挥手,附有代码+案列)
  • ④JdbcTemplate与声明式事务
  • MATLAB绘图基础6:MATLAB绘图基础
  • 仕考网:2025年公务员国考备考技巧
  • FastAPI数据模型:使用FormData extra参数防止数据污染
  • Python——将原来的gt.txt文件存为gt_原始.txt,修改后的文件作为 gt.txt
  • 基于Java+SpringBoot+Vue+MySQL的西安旅游管理系统网站
  • 828华为云征文|华为云Flexus云服务器X实例之openEuler系统下部署GitLab服务器
  • 开题报告中的研究方法设计:AI能帮你做什么?
  • 【Linux】进程控制(一)
  • 攻防世界--->你好,CTF
  • 使用协程实现高并发的I/O处理