自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(81)
  • 收藏
  • 关注

原创 do-while循环的使用及示例

do-while是C语言中的一种循环结构,与whiledo-while循环会先执行一次循环体,然后再检查条件表达式。这意味着do-while循环至少会执行一次。

2025-07-28 15:48:07 85

原创 C语言中va_list的使用方法

这样的函数,允许函数接受不定数量的参数。的宏和类型,通常用于实现类似。声明可变参数列表变量。

2025-07-28 15:46:57 368

原创 指针为啥能直接指向字符串,不能直接指向数字?

特性字符串字面量数字字面量存储位置静态存储区(只读数据段)通常直接嵌入指令是否有地址有(首字符地址)无(右值)指针操作可直接指向(如char*需通过变量或动态内存间接指向根本原因:指针需要内存地址,而字符串字面量在内存中有明确存储,数字字面量则没有。这是语言底层实现和类型系统的共同结果。

2025-07-28 15:44:25 306

原创 RTL代码修改后,验证那边通常需要做些什么修改去验证?

包括功能、性能、时序、可靠性等,确保芯片在真实场景中稳定运行。开展工作,确保覆盖所有关键场景。在IC设计中,验证的核心目标是。RTL设计完成后,验证团队需按。验证需覆盖IC设计的。

2025-07-19 10:45:23 501

原创 FPGA定义的寄存器为啥有些是只读,有些是只写,有的是可读可写

正确的寄存器属性设计能提升系统性能(减少20-40%逻辑资源)、增强安全性(防止关键寄存器被篡改),并优化时序(缩短关键路径延迟)。在FPGA设计中,寄存器的读写属性(只读、只写、可读可写)是由其在系统中的功能需求和硬件实现特性决定的。寄存器不是"存储变量",而是。状态(发送完成/数据就绪)将只写寄存器设计为可读。控制(使能/中断清除)

2025-07-19 10:44:35 918

原创 芯片验证的过程中常使用的是什么语言?为什么常说不能修改开发的RTL代码?

芯片验证依赖于SystemVerilog的核心地位与RTL代码的稳定性。前者提供结构化验证能力,后者确保验证目标与设计意图的一致性。两者结合,方能在千万行代码的复杂芯片中逼近“零缺陷”目标。

2025-07-19 10:43:38 1293

原创 怎么分析判断一个指针的类型?

/ 定义函数指针类型FuncPtr fp;// 明显是函数指针。

2025-07-19 10:42:41 452

原创 函数名就是指针么?

总结来说,在C语言中函数名确实表现为指向函数的指针,但它是一种特殊的指针类型,具有与普通数据指针不同的特性和使用规则。理解这种区别对于正确使用函数指针至关重要。在C语言中,函数名确实具有指针的特性,但它与普通指针有一些重要区别。),也可以显示使用解引用方式调用(*fp)()。:函数指针必须与目标函数类型完全匹配。:调用前应检查函数指针是否为NULL。:使用typedef提高代码可读性。运算符是允许的,但结果与不使用。返回指针大小(4/8字节):函数名不是左值,不能赋值。通常返回1(不表示大小)

2025-07-19 10:41:24 304

原创 对函数名使用&运算符,结果与不使用&相同么

在C/C++中,对函数名使用运算符是允许的,但通常没有必要,因为函数名在大多数表达式中会自动退化为函数指针。

2025-07-19 10:40:23 381

原创 函数指针解引用时,为啥加*和不加*都可以

函数指针调用时加或不加均可,因为编译器会忽略解引用操作,直接使用函数地址。推荐风格:直接ptr()更简洁。显式解引用(*ptr)()可强调是指针调用,增强可读性。两者无性能差异,按团队规范选择即可。

2025-07-19 10:39:39 344

原创 字符数组和字符指针的区别

特性字符数组 (e.g.,char str[]字符指针 (e.g.,char *ptr本质连续的内存块,存储字符本身变量,存储一个内存地址内存分配编译时静态分配 (栈或全局区)指针变量本身在栈上,指向的内存可动态分配内存所有权拥有自己的存储空间指向的内存可能属于数组、字面量或堆sizeof 结果数组总字节数 (包括'\0'指针变量的大小 (通常4或8字节)内容可变性✅ 元素可修改⚠️ 取决于指向的内存 (字面量不可改)地址可变性❌ 数组名是常量地址 (不可重新赋值)✅ 指针可指向不同地址初始化。

2025-07-19 10:38:30 244

原创 数组名是指针么?

如果需要进一步操作(如动态分配数组),通常需要使用指针(如。数组名和指针有相似之处,但。在大多数表达式中,数组名会。是元素类型),但它是。(即不能重新赋值)。

2025-07-12 11:32:04 312

原创 字符数组可以初始化赋值,却不能直接赋值,为啥?

这是由C语言的设计规则和底层内存管理机制决定的。下面详细解释原因。

2025-07-12 11:30:53 476

原创 如何防止函数内意外修改数组数据?

类型,编译器会阻止对数组内容的修改。:在函数参数中将数组指针声明为。需动态修改数组的场景。

2025-07-12 11:28:59 218

原创 数组作为函数入参传递,在函数内修改数据,原数据是否会被修改?

是的,在C语言中,。这是因为C语言中数组名作为函数参数传递时,实际上传递的是数组首元素的地址(指针),而不是数组的副本。

2025-07-12 11:28:08 404

原创 C语言,函数返回数组指针有几种方式?

方式优点缺点适用场景静态数组指针简单线程不安全,数据可能被覆盖单线程,固定大小动态分配 (malloc灵活,线程安全需手动free,可能泄漏可变长度数组固定大小数组指针类型明确语法复杂,仍依赖静态数组固定大小数组通过参数返回(推荐)最安全,线程安全需提前分配内存大多数情况结构体包装数组直接返回数组拷贝开销固定大小数组。

2025-07-12 11:26:55 300

原创 C语言中双重指针和数组指针有啥区别?

特性双重指针数组指针声明方式int **pp指向内容指向指针指向整个数组内存布局通常动态分配,内存可能不连续通常静态分配,单个连续的内存块算术运算以指针大小为单位。pp++移动一个指针的大小以数组大小为单位。pa++移动整个数组的大小灵活性可以指向不同长度的数组必须匹配声明的数组长度常见用途动态二维数组、字符串数组,动态数据结构(如稀疏矩阵等)静态多维数组、函数参数。固定大小的多维数组处理理解这些区别对于正确选择和使用这两种指针类型非常重要。

2025-07-12 11:25:58 368

原创 C语言中,指针数组和数组指针有啥区别

类型本质声明形式指针数组数组元素都是指针的数组数组指针指向整个数组的指针。

2025-07-02 20:09:18 419

原创 C语言单级指针和双重指针访问二维数组的区别

访问二维数组的方式有本质区别,主要体现在。动态分配的"伪二维数组"连续存储,直接计算偏移。行指针指向分散的内存块。更高(单次内存计算)较低(需两次解引用)直接匹配动态分配结构。依赖分配的行/列边界。

2025-07-02 20:07:18 264

原创 C语言中什么是动态数组,什么是静态数组

可能破坏堆内存结构,导致程序崩溃或数据损坏。静态数组越界同样危险,但影响的是栈内存。确定大小并分配内存的数组,其内存空间在程序启动或函数调用时自动分配。静态数组的大小在编译时确定,无法调整。如果需要可变大小,必须用动态数组。,否则程序运行时间越长,内存占用越大,最终可能导致崩溃。根据实际需求选择合适的数组类型,避免内存泄漏和越界访问!手动分配内存的数组,其大小可以动态调整。是两种不同的内存分配方式,它们在。,由程序员手动管理内存(必须用。自动管理(函数结束/程序结束),由系统自动管理内存。

2025-07-02 20:05:16 253

原创 C语言中,二维数组和双重指针有啥区别

特性二维数组双重指针内存连续性连续可能不连续大小是否固定编译时确定运行时动态分配访问方式直接计算偏移(arr[i][j]两次解引用(ptr[i][j]函数参数传递必须指定列数(如需传递行、列数(如int **ptr适用场景静态分配的固定大小数组动态分配的"伪二维数组"

2025-07-02 20:03:47 678

原创 C语言中,可以用单重指针访问二维数组?

可以二维数组必须是连续存储的静态数组。需手动计算偏移(动态分配的“模拟二维数组”(int**)不适用此方法。这种方法在需要高性能或直接操作内存时非常有用,但牺牲了代码的可读性。

2025-07-02 20:02:20 351

原创 C语言中,为啥二维数组可以展开为一维数组?

在C语言中,二维数组可以展开为一维数组的核心原因在于。

2025-07-02 20:01:34 338

原创 C语言中指针的大小和数组的大小有啥区别

结果显示:一般数组的大小 = 元素个数 × 每个元素的大小,使用 sizeof(array)计算返回的是整个数组所占用的字节数。如果作为函数参数传入函数内部时,数组退化为指针,sizeof(array)大小也由整个数组的大小变为指针的大小即 8 个字节。理解指针和数组大小的区别对于正确使用内存和避免缓冲区溢出等错误非常重要。在C语言中,指针的大小取决于系统和编译器的架构,而不是它所指向的数据类型。数组的大小是指数组占用的总内存字节数,可以通过。退化为指针(丢失大小信息)固定大小(4或8字节)

2025-07-02 20:00:23 369

原创 数组名为啥可以代表数组的首地址

简单来说就是,数组名可以表示为指针,但它不是指针变量,而是地址常量,不能修改。,这是由C语言的设计规范决定的。虽然数组名可以当作指针使用,但它。指针大小(通常4或8字节)取数组地址时,得到的是。在以下场景中,数组名。整个数组大小(字节)

2025-06-26 19:52:38 378

原创 哪些处理器是小端序,哪些处理器是大端序

通过理解处理器的字节序,可以避免数据解析错误(尤其在网络通信、嵌入式开发中)。现代高级语言(如Python/Java)通常隐藏了字节序细节,但底层开发(C/C++、汇编)仍需谨慎处理。旧版Mac(G5)、IBM服务器、PlayStation 3。手机(Android/iOS)、嵌入式设备。复古设备(Game Boy、老式计算机)个人电脑(Intel/AMD CPU)新兴开源硬件(物联网、AI芯片)可配置为大端序(需手动设置)默认大端序,部分支持小端模式。Arduino 微控制器。部分型号支持切换字节序。

2025-06-26 19:51:17 615

原创 使用C语言检测小端序和大端序的方法

低位字节在前(

2025-06-26 19:50:44 238

原创 侧信道时序攻击

进行RSA 4K验证函数实现时,其中注意事项之一是预防侧信道时序攻击,那么什么是侧信道时序攻击呢?某些加密算法(如RSA的模幂运算或AES的查表操作)的执行时间可能受密钥位的影响。如果前几个字符匹配,则会多花一些时间。的一种,不直接破解算法,而是利用物理或逻辑层面的信息泄露进行攻击。因此,安全编程必须考虑时间、功耗、电磁辐射等侧信道因素。来推断敏感信息(如密码、密钥等)的攻击方式。,结合统计方法,逐步推断出密钥或密码等机密数据。在关键操作中插入随机延迟,干扰时间测量。恒定时间编程、缓存隔离、随机化延迟。

2025-06-18 19:58:09 719

原创 大整数模幂转换成模乘的原理与实现

通过二进制分解指数,将幂运算转化为一系列可模的平方和乘法操作,显著降低计算复杂度(从 O(e)降到 O(log⁡e)从高位开始处理的实现 1 mod_pow_4096(result, num1, num2, m1);从地位开始处理的实现 2 mod_pow_lsb(result, num1, num2, m1);2, gmp 自带函数mpz_powm(result, num1, num2, m1);1,该方案使用 gmp 的函数实现,主要是为了验证模幂到模乘函数转换的正确性。

2025-06-18 14:26:07 401

原创 模运算的基本性质

对于整数a、b和正整数m,我们说a与b模m同余,记作:a≡b(modm)当且仅当m整除(a - b),即存在整数k使得:a−b=km。

2025-06-18 14:24:34 307

原创 C语言实现大整数加减法时,遇到进位该进多少位

在C语言中实现大整数加减法时,处理进位是核心问题之一。下面我将详细解释进位机制以及如何正确处理进位。

2025-06-18 14:23:42 496

原创 mpz_export函数详解

mpz_export是 GNU Multiple Precision Arithmetic Library (GMP) 中的一个函数,用于将 GMP 大整数 (mpz_t) 转换为二进制数据(字节数组)。它主要用于将大整数以特定字节序(endianness)和格式导出,便于存储、传输或与其他系统交互。void *data:目标缓冲区指针。int order:控制1-10:指定每个“字”(word)的字节大小(通常选1248size=1size=4int endian:控制01。

2025-06-05 16:26:29 710

原创 mpz_import 函数详解

mpz_import是 GMP 库中用于将二进制数据转换为高精度整数(mpz_t)的重要函数,它允许从特定字节序的二进制数据构造大整数。

2025-06-05 16:25:52 674

原创 gmp将uint*的数据转换成mpz格式

在 GMP (GNU Multiple Precision Arithmetic Library) 中将。任意长度二进制数据(如 uint8_t 数组)32/64 位整数(直接赋值)类型,有几种常见方法。不适用于 >64 位。

2025-06-05 16:25:22 256

原创 SHA-512和SHA-256的ASN.1 OID前缀区别

的 ASN.1 OID(Object Identifier)前缀的详细对比,包括它们的结构差异、DER 编码以及实际应用中的注意事项。如果需要其他哈希算法(如 SHA-384)的 OID,可通过类似方式从 RFC 或 OpenSSL 中获取。

2025-06-05 16:24:50 441

原创 C语言struct和enum结构体小知识

define//当代码中出现PI时,预处理器会直接替换为3.14159。如果加上分号:// 则替换后会变成:* r * r;// 语法错误!#define不加分号,因为它是预处理指令,宏替换会引入额外分号导致错误。typedef必须加分号,因为它是 C 声明语句,所有声明都需要分号结束。特性#define(宏定义)typedef(类型别名)处理阶段预处理阶段(编译前)编译阶段作用文本替换(直接替换代码中的符号)定义类型别名(创建新类型名)是否属于 C 语句❌ 不是 C 语句,是预处理指令。

2025-06-04 18:32:20 748

原创 C语言中枚举类型和typedef使用

enum 枚举名 {标识符1,标识符2,...标识符n。

2025-06-04 18:31:47 268

原创 C语言中memcpy 和strncpy的区别

都是用于数据复制的函数,但它们的设计目的、使用场景和行为方式有显著区别。可防止缓冲区溢出,但可能不终止字符串。较低(但需处理未终止的字符串)防止缓冲区溢出,但需手动检查。复制结构体、数组、二进制数据。复制字符串(安全防止溢出)结构体、数组等二进制数据。现代 C 代码(C11)仅当源字符串长度 <不超过目标缓冲区大小。更安全的替代(可选)

2025-06-03 20:05:10 531

原创 gcc生成静态库并调用

在 Linux 环境下使用 GCC 生成静态库(假设我们要创建一个数学库。编译时添加优化选项(如。,包含加法和减法功能。

2025-05-30 17:03:33 212

原创 静态库和动态库的区别

静态库(Static Library)和动态库(Dynamic Library,也称共享库)是两种不同的代码复用方式,它们在。通过合理选择库类型,可以平衡性能、维护成本和部署复杂度。每个程序独立包含库代码,占用更多内存。多个程序共享同一库,内存占用更少。只需替换库文件,程序无需重新编译。节省资源、支持热更新、便于维护。需确保目标系统存在对应动态库。独立性强、性能好、无依赖问题。启动快(无运行时加载开销)启动稍慢(需加载动态库)直接嵌入到可执行文件中。体积大、更新需重新编译。较小(仅保留库引用)

2025-05-30 17:02:30 366

空空如也

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除