- 博客(93)
- 收藏
- 关注
原创 结构体自引用时为啥不能直接使用typedef定义的新类型名?
int data;Node *next;// 指向下一个node的指针。此处为啥不能直接使用Node} Node;
2025-09-06 15:36:12
177
原创 C语言#if 和#ifdef的区别
都用于条件编译,但它们的用途和语法有显著区别。检查宏的值是否为非零(若未定义,视为 0)直接检查宏是否被定义(无论值是什么)支持复杂条件(如数值比较、组合逻辑)接受常量表达式(包括宏和逻辑运算)两者可以结合使用,例如通过。版本控制、动态功能配置(如。在C语言的预处理指令中,
2025-09-01 20:23:53
220
原创 C语言中为什么函数赋值给其他指针时,只有函数名,不带小括号?
是用于调用函数的运算符。当我们将函数赋值给指针时,需要的是函数的地址,而不是调用函数后的返回值。通过这种方式,C语言实现了函数指针的灵活使用,允许将函数作为参数传递、动态绑定等高级操作。在C语言中,函数名本身就代表函数的地址,而小括号。,而赋值时直接使用函数名(地址)。函数指针的声明需要指定函数的。
2025-08-28 18:29:54
200
原创 7.6,NVME控制器初始化和关闭流程
本节介绍在关机条件之前初始化控制器和关机处理的推荐过程。主机应按顺序执行以下操作,以初始化控制器,从而开始执行命令:1,根据系统配置适当设置第 2 节中所述的 PCI 和 PCI Express 寄存器,这包括电源管理功能的配置。单个中断(例如,基于引脚、单 MSI 或单 MSI-X),直到确定 I/O 端口数;2,主机通过等待 CSTS.RDY 变为“0”来,等待控制器指示任何先前的复位完成;3,应配置管理队列。通过将管理队列属性(AQA)、管理提交队列基地址(ASQ)和管理完成队列基地址(ACQ)设置为
2025-08-28 09:40:48
631
原创 7.3 Nvme reset
当出现以下情况时,启动 NVM 子系统复位:(1)主电源被施加到 NVM 子系统;(2)将 4 E564 D 65 h(“NVMe”)的值写入 NSSR.NSSRC 字段;(3)使用 NVMe 管理接口规范中定义的方法请求;或(4)发生供应商特定事件。当发生 NVM 子系统重置时,整个 NVM 子系统被重置。这包括,在构成 NVM 子系统的所有控制器上,发起控制器级复位,禁用与构成 NVM 子系统的所有控制器相关联的,持久性存储器区域,以及NVM子系统的所有PCI Express端口,检测到 LTSSM状态
2025-08-28 09:39:58
753
原创 指针与const
和指针的结合使用是一个常见但容易混淆的点,尤其是涉及指针指向的数据和指针本身的不可变性。用于定义常量,表示变量不可被修改。可以通过强制类型转换去掉。指针常量,指针本身不可变。的位置决定了它是修饰。
2025-08-25 10:15:00
370
原创 如何在Host主机识别PCIe设备但未识别NVMe的情况下,查看nvme配置
在Host主机识别PCIe设备但未识别NVMe的情况下,若需查看NVMe控制器寄存器内容,可通过或实现,同时需结合NVMe寄存器映射规范进行解析。
2025-08-19 19:53:06
432
原创 PCIE设备的PERST# 的 Assert 和 De-Assert信号什么作用?
PERST#(PCI Express Reset)的Assert(有效)和De-Assert(无效)信号触发时机及作用如下:
2025-08-09 15:12:31
509
原创 NVME使用PCI Express作为系统总线时的PCI Express寄存器值
BitsTypeReset31:00RW0h基地址 (BA):内存寄存器基地址的高 32 位(位 63:32)。注意:驻留在 PCI 兼容网桥后面的 NVM Express 实施(例如 PCI Express 端点)仅限于具有 32 位分配的基地址寄存器,因为网桥中可能为不可预取内存指定的最大地址受到限制。有关此限制的更多信息,请参阅 PCI Bridge 1.2 规范。
2025-08-09 15:05:59
744
原创 C语言inline 和define用法和使用场景上有啥区别
均用于代码优化,但两者在机制、安全性、调试和系统影响等方面存在本质差异。:减少函数调用开销,适合短小且频繁调用的函数(如循环内操作)。:编译器可能拒绝内联(如函数过大或递归),过度使用同样导致。(每次调用都展开),且替换后的表达式可能增加额外计算(如。宏的全局性易引发重定义冲突(如头文件重复包含)。:调试器可直接跟踪函数逻辑,错误信息更清晰。❌无类型检查,易引发隐式转换错误(如传递。中,确保多文件调用时编译器能内联展开。支持作用域封装,减少命名冲突风险。:无函数调用开销(无栈帧操作)。
2025-08-02 15:31:27
421
原创 do-while循环的使用及示例
do-while是C语言中的一种循环结构,与whiledo-while循环会先执行一次循环体,然后再检查条件表达式。这意味着do-while循环至少会执行一次。
2025-07-28 15:48:07
285
原创 指针为啥能直接指向字符串,不能直接指向数字?
特性字符串字面量数字字面量存储位置静态存储区(只读数据段)通常直接嵌入指令是否有地址有(首字符地址)无(右值)指针操作可直接指向(如char*需通过变量或动态内存间接指向根本原因:指针需要内存地址,而字符串字面量在内存中有明确存储,数字字面量则没有。这是语言底层实现和类型系统的共同结果。
2025-07-28 15:44:25
426
原创 RTL代码修改后,验证那边通常需要做些什么修改去验证?
包括功能、性能、时序、可靠性等,确保芯片在真实场景中稳定运行。开展工作,确保覆盖所有关键场景。在IC设计中,验证的核心目标是。RTL设计完成后,验证团队需按。验证需覆盖IC设计的。
2025-07-19 10:45:23
588
原创 FPGA定义的寄存器为啥有些是只读,有些是只写,有的是可读可写
正确的寄存器属性设计能提升系统性能(减少20-40%逻辑资源)、增强安全性(防止关键寄存器被篡改),并优化时序(缩短关键路径延迟)。在FPGA设计中,寄存器的读写属性(只读、只写、可读可写)是由其在系统中的功能需求和硬件实现特性决定的。寄存器不是"存储变量",而是。状态(发送完成/数据就绪)将只写寄存器设计为可读。控制(使能/中断清除)
2025-07-19 10:44:35
1076
原创 芯片验证的过程中常使用的是什么语言?为什么常说不能修改开发的RTL代码?
芯片验证依赖于SystemVerilog的核心地位与RTL代码的稳定性。前者提供结构化验证能力,后者确保验证目标与设计意图的一致性。两者结合,方能在千万行代码的复杂芯片中逼近“零缺陷”目标。
2025-07-19 10:43:38
1397
原创 函数名就是指针么?
总结来说,在C语言中函数名确实表现为指向函数的指针,但它是一种特殊的指针类型,具有与普通数据指针不同的特性和使用规则。理解这种区别对于正确使用函数指针至关重要。在C语言中,函数名确实具有指针的特性,但它与普通指针有一些重要区别。),也可以显示使用解引用方式调用(*fp)()。:函数指针必须与目标函数类型完全匹配。:调用前应检查函数指针是否为NULL。:使用typedef提高代码可读性。运算符是允许的,但结果与不使用。返回指针大小(4/8字节):函数名不是左值,不能赋值。通常返回1(不表示大小)
2025-07-19 10:41:24
340
原创 对函数名使用&运算符,结果与不使用&相同么
在C/C++中,对函数名使用运算符是允许的,但通常没有必要,因为函数名在大多数表达式中会自动退化为函数指针。
2025-07-19 10:40:23
431
原创 函数指针解引用时,为啥加*和不加*都可以
函数指针调用时加或不加均可,因为编译器会忽略解引用操作,直接使用函数地址。推荐风格:直接ptr()更简洁。显式解引用(*ptr)()可强调是指针调用,增强可读性。两者无性能差异,按团队规范选择即可。
2025-07-19 10:39:39
417
原创 字符数组和字符指针的区别
特性字符数组 (e.g.,char str[]字符指针 (e.g.,char *ptr本质连续的内存块,存储字符本身变量,存储一个内存地址内存分配编译时静态分配 (栈或全局区)指针变量本身在栈上,指向的内存可动态分配内存所有权拥有自己的存储空间指向的内存可能属于数组、字面量或堆sizeof 结果数组总字节数 (包括'\0'指针变量的大小 (通常4或8字节)内容可变性✅ 元素可修改⚠️ 取决于指向的内存 (字面量不可改)地址可变性❌ 数组名是常量地址 (不可重新赋值)✅ 指针可指向不同地址初始化。
2025-07-19 10:38:30
320
原创 数组名是指针么?
如果需要进一步操作(如动态分配数组),通常需要使用指针(如。数组名和指针有相似之处,但。在大多数表达式中,数组名会。是元素类型),但它是。(即不能重新赋值)。
2025-07-12 11:32:04
351
原创 数组作为函数入参传递,在函数内修改数据,原数据是否会被修改?
是的,在C语言中,。这是因为C语言中数组名作为函数参数传递时,实际上传递的是数组首元素的地址(指针),而不是数组的副本。
2025-07-12 11:28:08
501
原创 C语言,函数返回数组指针有几种方式?
方式优点缺点适用场景静态数组指针简单线程不安全,数据可能被覆盖单线程,固定大小动态分配 (malloc灵活,线程安全需手动free,可能泄漏可变长度数组固定大小数组指针类型明确语法复杂,仍依赖静态数组固定大小数组通过参数返回(推荐)最安全,线程安全需提前分配内存大多数情况结构体包装数组直接返回数组拷贝开销固定大小数组。
2025-07-12 11:26:55
408
原创 C语言中双重指针和数组指针有啥区别?
特性双重指针数组指针声明方式int **pp指向内容指向指针指向整个数组内存布局通常动态分配,内存可能不连续通常静态分配,单个连续的内存块算术运算以指针大小为单位。pp++移动一个指针的大小以数组大小为单位。pa++移动整个数组的大小灵活性可以指向不同长度的数组必须匹配声明的数组长度常见用途动态二维数组、字符串数组,动态数据结构(如稀疏矩阵等)静态多维数组、函数参数。固定大小的多维数组处理理解这些区别对于正确选择和使用这两种指针类型非常重要。
2025-07-12 11:25:58
399
原创 C语言单级指针和双重指针访问二维数组的区别
访问二维数组的方式有本质区别,主要体现在。动态分配的"伪二维数组"连续存储,直接计算偏移。行指针指向分散的内存块。更高(单次内存计算)较低(需两次解引用)直接匹配动态分配结构。依赖分配的行/列边界。
2025-07-02 20:07:18
313
原创 C语言中什么是动态数组,什么是静态数组
可能破坏堆内存结构,导致程序崩溃或数据损坏。静态数组越界同样危险,但影响的是栈内存。确定大小并分配内存的数组,其内存空间在程序启动或函数调用时自动分配。静态数组的大小在编译时确定,无法调整。如果需要可变大小,必须用动态数组。,否则程序运行时间越长,内存占用越大,最终可能导致崩溃。根据实际需求选择合适的数组类型,避免内存泄漏和越界访问!手动分配内存的数组,其大小可以动态调整。是两种不同的内存分配方式,它们在。,由程序员手动管理内存(必须用。自动管理(函数结束/程序结束),由系统自动管理内存。
2025-07-02 20:05:16
346
原创 C语言中,二维数组和双重指针有啥区别
特性二维数组双重指针内存连续性连续可能不连续大小是否固定编译时确定运行时动态分配访问方式直接计算偏移(arr[i][j]两次解引用(ptr[i][j]函数参数传递必须指定列数(如需传递行、列数(如int **ptr适用场景静态分配的固定大小数组动态分配的"伪二维数组"
2025-07-02 20:03:47
736
原创 C语言中,可以用单重指针访问二维数组?
可以二维数组必须是连续存储的静态数组。需手动计算偏移(动态分配的“模拟二维数组”(int**)不适用此方法。这种方法在需要高性能或直接操作内存时非常有用,但牺牲了代码的可读性。
2025-07-02 20:02:20
378
原创 C语言中指针的大小和数组的大小有啥区别
结果显示:一般数组的大小 = 元素个数 × 每个元素的大小,使用 sizeof(array)计算返回的是整个数组所占用的字节数。如果作为函数参数传入函数内部时,数组退化为指针,sizeof(array)大小也由整个数组的大小变为指针的大小即 8 个字节。理解指针和数组大小的区别对于正确使用内存和避免缓冲区溢出等错误非常重要。在C语言中,指针的大小取决于系统和编译器的架构,而不是它所指向的数据类型。数组的大小是指数组占用的总内存字节数,可以通过。退化为指针(丢失大小信息)固定大小(4或8字节)
2025-07-02 20:00:23
432
原创 数组名为啥可以代表数组的首地址
简单来说就是,数组名可以表示为指针,但它不是指针变量,而是地址常量,不能修改。,这是由C语言的设计规范决定的。虽然数组名可以当作指针使用,但它。指针大小(通常4或8字节)取数组地址时,得到的是。在以下场景中,数组名。整个数组大小(字节)
2025-06-26 19:52:38
474
原创 哪些处理器是小端序,哪些处理器是大端序
通过理解处理器的字节序,可以避免数据解析错误(尤其在网络通信、嵌入式开发中)。现代高级语言(如Python/Java)通常隐藏了字节序细节,但底层开发(C/C++、汇编)仍需谨慎处理。旧版Mac(G5)、IBM服务器、PlayStation 3。手机(Android/iOS)、嵌入式设备。复古设备(Game Boy、老式计算机)个人电脑(Intel/AMD CPU)新兴开源硬件(物联网、AI芯片)可配置为大端序(需手动设置)默认大端序,部分支持小端模式。Arduino 微控制器。部分型号支持切换字节序。
2025-06-26 19:51:17
771
原创 侧信道时序攻击
进行RSA 4K验证函数实现时,其中注意事项之一是预防侧信道时序攻击,那么什么是侧信道时序攻击呢?某些加密算法(如RSA的模幂运算或AES的查表操作)的执行时间可能受密钥位的影响。如果前几个字符匹配,则会多花一些时间。的一种,不直接破解算法,而是利用物理或逻辑层面的信息泄露进行攻击。因此,安全编程必须考虑时间、功耗、电磁辐射等侧信道因素。来推断敏感信息(如密码、密钥等)的攻击方式。,结合统计方法,逐步推断出密钥或密码等机密数据。在关键操作中插入随机延迟,干扰时间测量。恒定时间编程、缓存隔离、随机化延迟。
2025-06-18 19:58:09
1061
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人