深入解析C/C++中sizeof(arr)/sizeof(arr[0])的陷阱与替代方案
1. 从一段“经典”代码引发的困惑说起如果你写过C或者C下面这行代码你肯定不陌生int arr[10]; int size sizeof(arr) / sizeof(arr[0]);这行代码几乎是所有C/C入门教材里用来计算数组元素个数的“标准答案”。sizeof(arr)得到整个数组占用的字节数sizeof(arr[0])得到单个数组元素占用的字节数两者相除自然就得到了数组的元素个数。看起来天衣无缝简单明了对吧但如果你像我一样在真实的项目里摸爬滚打几年再回头看这行代码心里可能会“咯噔”一下。我第一次产生怀疑是在一个跨模块传递数组的场景里。一个函数接收一个int*指针我需要在这个函数内部知道这个数组原本有多少个元素。我下意识地写下了sizeof(ptr) / sizeof(ptr[0])结果编译是过了但运行起来size的值完全不对程序直接跑飞。那一刻我才意识到这个看似万能的公式其实有着非常明确的、而且容易被忽略的作用域和前提条件。后来随着接触的代码越来越多我发现这个“经典”用法背后藏着不少细节当数组作为函数参数传递时会发生什么在C的模板元编程里它又扮演什么角色sizeof是在编译期还是运行期求值为什么有些静态分析工具会对它报警告这些问题绝不是一句“数组大小除以元素大小”就能概括的。今天我们就来彻底拆解sizeof(arr)/sizeof(arr[0])。我不会只重复教科书上的定义而是结合我这些年踩过的坑、调试过的诡异Bug以及它在现代C中的演变带你看看这个“古董级”技巧的里里外外。你会发现它既是一个理解C/C内存模型和类型系统的绝佳入口也是一个稍不留神就会引入隐患的“雷区”。2.sizeof运算符的本质编译期的“尺子”在深入那个除法公式之前我们必须先搞清楚sizeof到底是个什么东西。很多初学者会误以为sizeof是一个函数因为它后面跟着括号。但实际上它是一个运算符而且是唯一一个在C/C标准中明确说明其大部分使用场景是在编译期就完成计算的运算符。2.1sizeof的两种形式与求值时机sizeof有两种使用形式sizeof(类型)例如sizeof(int)、sizeof(double*)。sizeof 表达式例如sizeof arr、sizeof(x y)。注意当表达式是变量名时括号可以省略但为了清晰和避免优先级问题我强烈建议永远加上括号写成sizeof(arr)。关键在于它的求值时机。sizeof的操作数无论是类型还是表达式不会被实际求值evaluated。编译器只关心操作数的类型然后根据这个类型在目标平台上的大小直接算出一个size_t类型的常量。看这个例子int func() { printf(This will NOT be printed!\\n); return 42; } int main() { size_t s sizeof(func()); // func() 不会被调用 printf(Size is: %zu\\n, s); // 输出可能是 4 (在32/64位系统上int的大小) return 0; }程序运行后你不会看到This will NOT be printed!这行输出。因为编译器在编译时看到func()的返回类型是int就直接用sizeof(int)的结果替换了sizeof(func())函数调用根本没有发生。这就是“不求值”的含义。注意这里有一个特例当sizeof的操作数是可变长度数组VLAC99标准引入C标准不支持时它需要在运行时计算数组大小。但在我们讨论的固定大小数组和sizeof(arr)/sizeof(arr[0])的经典场景中它绝对是编译期常量。2.2sizeof的结果类型size_tsizeof返回值的类型是size_t这是一个定义在stddef.h(C) 或cstddef(C) 中的无符号整数类型。它的具体大小32位还是64位取决于目标平台和编译模式。使用size_t是为了保证它能表示系统中任何对象在内存中可能的最大大小。在打印size_t值时应该使用%zu格式说明符C99/C11起printf(Array size: %zu\\n, sizeof(arr) / sizeof(arr[0]));在C中更推荐使用std::coutstd::cout Array size: (sizeof(arr) / sizeof(arr[0])) std::endl;如果你在旧的代码或平台上看到用%u或强制转换来打印那可能是为了兼容不支持%zu的老编译器但这存在移植风险。理解了sizeof是编译期的“尺子”我们才能明白为什么sizeof(arr)/sizeof(arr[0])在某些场合有效在某些场合失效。因为它量的不是运行时的“内容”而是编译时就已经确定的“类型”的尺寸。3.sizeof(arr)/sizeof(arr[0])的有效场景与严格前提现在我们来聚焦这个除法公式。它的有效性建立在一个非常脆弱的前提上arr必须是一个在当前作用域内具有完整数组类型的对象。3.1 理想情况栈上的局部数组或全局数组这是教科书上的标准场景也是它唯一能100%正确工作的场景。// 场景1局部数组 void local_array_example() { int arr[10]; // ‘arr’ 在这里的类型是 ‘int[10]‘一个完整的数组类型 size_t count sizeof(arr); // 得到 10 * sizeof(int) 40 (假设int为4字节) size_t elem_size sizeof(arr[0]); // 得到 sizeof(int) 4 size_t num_elements count / elem_size; // 40 / 4 10正确 } // 场景2全局数组 int global_arr[100]; void global_array_example() { size_t num sizeof(global_arr) / sizeof(global_arr[0]); // 100正确 }在这两个例子里编译器在编译local_array_example和global_array_example函数时清楚地知道arr和global_arr的完整类型信息分别是int[10]和int[100]。因此sizeof(arr)能准确地计算出整个数组的字节大小。3.2 经典陷阱数组作为函数参数传递这是新手甚至一些老手最容易栽跟头的地方。C/C中数组不能直接作为函数参数传递。当你试图这样做时会发生“数组到指针的衰减”。void process_array(int arr[]) { // 或者写成 int* arr // 在这里arr 已经不是一个数组了 size_t wrong_size sizeof(arr); // 这是 sizeof(int*)指针的大小 size_t elem_size sizeof(arr[0]); // 这还是 sizeof(int) size_t wrong_count wrong_size / elem_size; // 结果通常是 2 或 1 (64位系统下8/4232位系统下4/41) // 这个结果和原数组大小毫无关系完全错误 } int main() { int my_array[50]; process_array(my_array); // 传递的是 my_array[0]一个 int* 指针 return 0; }在process_array函数内部形参arr的类型实际上是int*而不是int[50]。sizeof(arr)计算的是指针变量本身的大小在64位系统通常是8字节而不是它指向的数组的总大小。所以那个除法公式在这里彻底失效。这就是为什么你永远不应该在函数内部用这个公式来计算传入的“数组”大小。函数如果需要知道数组大小必须通过额外的参数显式传递void process_array_correctly(int* arr, size_t count) { // 现在我们可以安全地使用 count 了 for (size_t i 0; i count; i) { // 处理 arr[i] } }3.3 结构体或类中的数组成员如果数组是结构体或类的成员情况又如何struct MyStruct { int data[20]; char name[32]; }; int main() { MyStruct s; size_t data_count sizeof(s.data) / sizeof(s.data[0]); // 20正确 // 因为 s.data 在这里仍然是一个类型完整的数组int[20] return 0; }在结构体对象s的作用域内访问其成员s.data编译器知道它的完整类型是int[20]所以公式依然有效。但是如果你把整个结构体对象传入函数并在函数内部试图用sizeof(param.data)又会遇到和之前一样的问题吗不会因为这里param是一个MyStruct对象或引用/指针param.data作为成员访问其类型在编译期对函数来说是已知的假设函数声明中形参类型是MyStruct或MyStruct。但如果通过指针访问且上下文丢失了数组维度信息则可能失效。这引出了C中更强大的工具。4. C的进化更安全的替代方案与编译期计算C语言对数组的“裸奔”式处理带来了很多陷阱。C在提供向后兼容的同时也引入了一系列机制来更安全、更清晰地处理数组大小。4.1std::size()(C17)这是最直接、最现代的替代方案。定义在iterator头文件中。#include iostream #include iterator // for std::size #include array // for std::array int main() { int c_array[] {1, 2, 3, 4, 5}; // 传统C风格数组 std::arrayint, 5 cpp_array {6, 7, 8, 9, 10}; // 对C风格数组和std::array都有效 std::cout C array size: std::size(c_array) std::endl; // 输出 5 std::cout std::array size: std::size(cpp_array) std::endl; // 输出 5 // 但是对指针无效 int* ptr c_array; // std::cout std::size(ptr) std::endl; // 编译错误 return 0; }std::size()的优点在于清晰直观语义明确就是获取大小。类型安全如果对指针使用会在编译期报错避免了运行时的神秘错误。泛型支持它同样适用于标准库容器如vector,list和std::array。它的内部实现对于数组很可能就是sizeof(arr)/sizeof(arr[0])的封装但为你做了安全检查。4.2std::array彻底告别C风格数组对于C项目我个人的建议是除非有极特殊的兼容性或性能考量并且经过测量否则默认使用std::array替代内置的C风格数组。#include array void safe_function(const std::arrayint, 50 arr) { // 大小是类型的一部分 size_t count arr.size(); // 总是 50清晰且安全 // ... 使用 arr } int main() { std::arrayint, 50 my_array; safe_function(my_array); // 安全大小信息随类型一起传递 return 0; }std::array将数组大小作为模板参数的一部分因此大小信息在编译期就固化在类型里。arr.size()是一个简单的内联函数调用返回的就是那个编译期常量。它保留了C风格数组栈上分配、性能零开销的优点同时提供了清晰的接口、避免指针衰减、支持迭代器和标准库算法。4.3 模板元编程在编译期“计算”大小在一些模板代码或元编程场景中我们可能需要在不实例化对象的情况下仅通过类型来获取数组大小。这时sizeof除法公式的编译期特性就派上了用场。templatetypename T, std::size_t N constexpr std::size_t array_size(T ()[N]) noexcept { return N; } templatetypename T struct array_traits; templatetypename T, std::size_t N struct array_traitsT[N] { using value_type T; static constexpr std::size_t size N; }; int main() { int arr[30]; constexpr std::size_t s1 array_size(arr); // 编译期常量 30 constexpr std::size_t s2 array_traitsdecltype(arr)::size; // 同样是 30 // 这些值可以用于需要编译期常量的地方比如模板参数或静态断言 static_assert(s1 30, Array size mismatch!); return 0; }array_size函数模板通过引用传递数组T ()[N]巧妙地捕获了数组的大小N并作为返回值。因为参数是数组的引用所以不会发生指针衰减类型T[N]是完整的。这个函数通常被声明为constexpr意味着它可以在编译期求值。array_traits则是一个类型萃取type traits的例子它专门针对数组类型进行偏特化从中提取出元素类型和大小。这些技巧在编写通用库代码时非常有用它们将sizeof(arr)/sizeof(arr[0])的思想提升到了类型系统的层面更加安全和强大。5. 深入细节与边界情况讨论掌握了基本规则和现代替代品后我们再来啃一些硬骨头看看那些容易让人迷惑的边界情况。5.1 对指针使用sizeof量的是指针本身这一点再怎么强调都不为过。sizeof作用于指针时返回的是存储这个指针所需的内存字节数与它指向什么、指向多少数据毫无关系。int huge_array[10000]; int* ptr huge_array; printf(Size of pointer: %zu\\n, sizeof(ptr)); // 输出 8 (64位系统) 或 4 (32位系统) printf(Size of array: %zu\\n, sizeof(huge_array)); // 输出 40000 (假设int为4字节)如果你错误地在函数内用sizeof(ptr)去推断数组大小得到的结果会是一个平台相关的固定小数字4或8这会导致缓冲区溢出或访问越界等严重错误。5.2 零长度数组GNU扩展与柔性数组成员这是两个特殊的、非标准的用法但在一些特定场景尤其是底层或嵌入式代码中能看到。零长度数组是GNU C的扩展通常出现在结构体的末尾用来实现可变长度的结构体。struct packet { int header; char data[0]; // 零长度数组不占空间或占0空间 };sizeof(struct packet)可能只包含header的大小。sizeof(data)在某些编译器上可能是0sizeof(data)/sizeof(data[0])的行为是未定义的除零或得到0。这种用法高度不可移植且在现代C中应被std::vector或动态分配替代。柔性数组成员是C99标准引入的更规范一些struct flex_packet { int header; char data[]; // 柔性数组成员必须是最后一个成员 };同样sizeof(struct flex_packet)不包括data数组的内存。你不能对data使用sizeof除法公式来计算大小因为它的大小在结构体定义时是未知的。5.3sizeof与字符数组字符串字面量处理字符串时也要小心。char str[] Hello; // 自动推导为 char[6]包含结尾的\\0 size_t len_with_null sizeof(str); // 6 size_t char_count sizeof(str) / sizeof(str[0]); // 6 / 1 6 const char* ptr World; size_t ptr_size sizeof(ptr); // 指针大小比如 8 // sizeof(ptr)/sizeof(ptr[0]) 结果是 8 或 4毫无意义如果你需要的是字符串的长度不包括空终止符应该使用strlen(str)而不是sizeof公式。sizeof公式得到的是数组的总容量包括\\0而strlen得到的是\\0之前的字符数。5.4 多维度数组对于多维数组sizeof除法公式依然有效但你需要清楚你在计算哪个维度。int matrix[3][4]; // 3行4列的二维数组 size_t total_elements sizeof(matrix) / sizeof(matrix[0][0]); // (3*4*sizeof(int)) / sizeof(int) 12 size_t rows sizeof(matrix) / sizeof(matrix[0]); // (3*4*sizeof(int)) / (4*sizeof(int)) 3 size_t cols sizeof(matrix[0]) / sizeof(matrix[0][0]); // (4*sizeof(int)) / sizeof(int) 4matrix的类型是int[3][4]matrix[0]的类型是int[4]。通过组合使用可以推导出各个维度的大小。这在处理静态的多维数组时偶尔有用但同样要注意指针衰减问题——如果你把matrix传递给一个函数如void func(int mat[][4])在函数内部你只能安全地推导出列数行数仍需传递。6. 静态分析与编译器警告识别潜在误用一个好的开发习惯是开启编译器的所有警告并配合静态分析工具。它们能帮你提前发现sizeof除法的误用。例如在GCC或Clang中使用-Wall -Wextra标志gcc -Wall -Wextra -c your_file.c考虑以下有问题的代码void bad_function(int arr[]) { int count sizeof(arr) / sizeof(arr[0]); // 可疑 // ... }较新版本的GCC/Clang可能会给出类似这样的警告warning: ‘sizeof’ on array function parameter ‘arr’ will return size of ‘int *’ [-Wsizeof-array-argument] warning: division ‘sizeof (arr) / sizeof (arr[0])’ does not compute the number of array elements [-Wsizeof-pointer-div]第一个警告告诉你sizeof(arr)得到的是指针大小。第二个警告直接指出这个除法不能用来计算数组元素个数。对于C代码使用-Wall -Wextra -pedantic可以捕获更多问题。像Clang-Tidy、PVS-Studio这类高级静态分析工具更能深入上下文指出“在函数参数已退化为指针的数组上使用sizeof除法”这类经典错误。我的建议是将这类警告视为错误-Werror或/WX强制自己修复它们。对于确实需要计算数组大小的场景显式地传递大小参数或者重构代码使用std::array/std::vector。7. 实战经验何时用何时不用以及如何正确使用结合我多年的项目经验我总结了一份关于sizeof(arr)/sizeof(arr[0])的实用指南坚决不用的情况函数参数中的“数组”这是铁律。只要形参被声明为T arr[]或T* arr就绝对不要用这个公式。动态分配的内存对于int* arr new int[100];sizeof(arr)仍然是指针大小。通过指针接收的内存块从任何接口如库函数、网络接收获取到的指针都无法用此公式得知其指向的数据量。可以谨慎使用的情况同一作用域内的静态/自动存储期数组在定义数组的同一个函数或块作用域内计算其大小。例如用于初始化一个循环的终止条件但更好的做法是将其存入一个constexpr变量。int lookup_table[] {0, 1, 4, 9, 16}; constexpr size_t table_size sizeof(lookup_table) / sizeof(lookup_table[0]); for (size_t i 0; i table_size; i) { // ... }编译期常量需求在需要编译期整型常量的地方如模板参数、静态断言、位域长度等而你又不想手动计算字面量个数时。int pins[] {PIN1, PIN2, PIN3, PIN4}; static_assert((sizeof(pins)/sizeof(pins[0])) 4, Expected 4 pins);更优的替代方案C首选std::size()(C17及以上)意图清晰安全。对于固定大小集合首选std::array将大小作为类型信息一劳永逸。对于运行时大小可变集合使用std::vectorvec.size()是运行时的但安全且灵活。使用模板或constexpr函数封装如果你需要支持C11/14或者编写泛型库可以自己实现一个类似array_size的constexpr函数模板这比裸的sizeof除法更安全、表达力更强。一个容易被忽略的细节sizeof和alignof在涉及内存对齐的底层代码中sizeof计算的是对象占用的总字节数这个大小可能因为内存对齐Padding而大于所有成员大小之和。sizeof(arr)/sizeof(arr[0])计算的是元素个数这个计算本身不受对齐影响因为分子分母的对齐填充会被约掉。但如果你用sizeof(arr)去做内存分配或拷贝的计算就需要意识到对齐填充的存在。alignof运算符可以查询类型的对齐要求。最后记住这个公式的核心它本质上是编译器利用已知的类型信息在编译期进行的一个常量算术运算。一旦类型信息丢失如退化为指针或者所求值并非编译期常量如VLA它就会失效或产生非预期结果。理解这一点你就能在纷繁复杂的代码中准确地判断出该用它还是该寻找更安全的工具。

相关新闻

Windows下Node.js环境配置全攻略:从PATH变量到版本管理

Windows下Node.js环境配置全攻略:从PATH变量到版本管理

1. 从“命令不存在”到环境搭建:一个前端工程师的必经之路 那天下午,我正在为一个遗留的Vue项目准备上线前的最后打包。项目根目录下,我习惯性地打开PowerShell,敲入那串再熟悉不过的命令: npm run build 。回车之后…

2026/10/13 22:56:40 阅读更多 →
SCL编程实战:西门子PLC中BYTE与WORD数据转换与字节序处理

SCL编程实战:西门子PLC中BYTE与WORD数据转换与字节序处理

1. 项目背景与核心需求:为什么要在STEP7中用SCL处理字节与字? 在工业自动化领域,尤其是西门子S7-300/400/1500系列PLC的编程中,数据类型的转换与重组是日常开发中最基础也最频繁的操作之一。你可能会遇到各种传感器、仪表或第三方…

2026/10/12 23:21:42 阅读更多 →
从零部署角色AI交互项目:环境配置、功能实测与深度定制指南

从零部署角色AI交互项目:环境配置、功能实测与深度定制指南

这类主题最值得先看的不是功能列表,而是它到底解决了什么具体问题,以及能不能在你的环境下稳定跑起来。从标题来看,这很可能是一个围绕特定角色“心海”的互动或内容生成项目。它可能是一个游戏模组、一个聊天机器人、一个桌面应用&#xff0…

2026/10/7 18:07:46 阅读更多 →

最新新闻

K12 少儿编程资料(第六篇):Scratch 教案课件全套,零基础家长和老师都能直接用w

K12 少儿编程资料(第六篇):Scratch 教案课件全套,零基础家长和老师都能直接用w

机器人编程课程:孩子从搭积木到"让程序控制现实世界"的启蒙资料(转存自取)⚡ 资料直达(建议先转存到自己网盘,再慢慢下载) 本文是「K12 少儿编程资料」系列的第 5 篇,聚焦 机器人编程…

2026/10/15 5:27:16 阅读更多 →
Java接口default方法:原理、应用与最佳实践

Java接口default方法:原理、应用与最佳实践

1. 接口default修饰符的本质与价值在Java 8之前,接口就像一份严格的契约——它只能定义抽象方法,所有实现类必须完整实现这些方法。这种设计虽然保证了契约的严谨性,但也带来了扩展性的问题。想象一下,当一个接口被上百个类实现后…

2026/10/15 5:27:16 阅读更多 →
用蛋白质“织”出来的生物材料,正在改变医学 | Info X Med 深度文献解读

用蛋白质“织”出来的生物材料,正在改变医学 | Info X Med 深度文献解读

文献来源:Info X Med 期刊《Nature Reviews Materials(Perspective)》DOI:10.1038/s41578-025-00861-8结论先行: 从最早的丝、胶原、弹性蛋白,到如今用 AI“从头设计”的全新蛋白质,蛋白质基生物…

2026/10/15 5:27:16 阅读更多 →
生产汇报单查询同步实战:从金蝶云星空拉取到轻易云数据集成平台的工程化做法

生产汇报单查询同步实战:从金蝶云星空拉取到轻易云数据集成平台的工程化做法

这个策略解决什么问题某离散制造企业的 MES 在 MySQL 里,ERP 用的是金蝶云星空,生产汇报单由车间在 MES 里录入,需要在 ERP 端沉淀成可查询、可核算的正式单据。我们用轻易云数据集成平台(Qeasy)承接了"GH生产汇报单查询"这条策略,本质上是把金蝶云星空里已经存在的生…

2026/10/15 5:27:16 阅读更多 →
Java接口核心概念与应用场景详解

Java接口核心概念与应用场景详解

1. Java接口核心概念解析接口(Interface)是Java语言中实现抽象的核心机制之一。与抽象类不同,接口是完全抽象的契约定义,它规定了实现类必须遵守的行为规范。理解接口的关键在于把握其"定义规范与实现分离"的设计哲学。…

2026/10/15 5:27:16 阅读更多 →
嵌入式验证性实验:从跑通代码到写出真正的实验体会

嵌入式验证性实验:从跑通代码到写出真正的实验体会

简介:苏州大学金葫芦平台下的《嵌入式系统》六个验证性实验,以一份Word实验报告完整呈现:实验一熟悉AHL-GEC-IDE环境、GPIO构件调用及输入输出控制,实验二串行接收中断、多字节组帧与C#串口调试,实验三PWM信号生成及占…

2026/10/15 5:26:11 阅读更多 →

日新闻

Docker Compose 容器化部署 ChirpStack LoRaWAN 网络服务器实战

Docker Compose 容器化部署 ChirpStack LoRaWAN 网络服务器实战

1. 为什么选择容器化方式部署 LoRa 网络服务LoRa 物联网项目落地时,网络服务器是整个链路的核心枢纽。它负责接收网关上报的数据包、完成去重与解密、再把有效载荷分发给上层应用。早期大家习惯把网络服务器直接装在物理机上,依赖一堆系统库和特定版本的…

2026/10/15 0:00:46 阅读更多 →
共享LLM服务下的跨模型自动扩缩容:Kubernetes实战与避坑指南

共享LLM服务下的跨模型自动扩缩容:Kubernetes实战与避坑指南

1. 共享推理服务里,扩缩容到底难在哪做过大模型推理服务部署的人,大概都经历过这样的场景:一个团队共用一套推理集群,A 业务跑的是 7B 的小模型,B 业务跑的是 72B 的大模型,C 业务白天流量高、晚上几乎归零…

2026/10/15 0:00:46 阅读更多 →
Systemd 启动阶段根文件系统只读之谜:fstab 与 remount-fs 服务深度解析

Systemd 启动阶段根文件系统只读之谜:fstab 与 remount-fs 服务深度解析

1. 引子:一次内核恐慌引发的追查先从一个真实场景说起。某次我给一台老旧的嵌入式设备折腾系统裁减,为了把启动时间压进两秒以内,我手贱地把一串自认为“没用”的 systemd 服务给 disable 了,其中就包括systemd-remount-fs.servic…

2026/10/15 0:00:46 阅读更多 →

周新闻

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

简介:基于 ARIMA、LSTM、Transformer 等模型的流感时间序列预测 Python 源码,面向计算机相关专业课程设计与期末大作业学生,以及项目实战学习者。内容覆盖预处理、平稳性检验、定阶、残差分析、多模型对比预测的完整时序建模流程,…

2026/10/14 3:30:28 阅读更多 →
影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别 做影刀RPA自动化,十个新手有八个栽在"往输入框里填东西"这件事上:要么填不进去,要么填了一半,要么直接把原来内容追加在后面。这背后的根因&…

2026/10/14 16:30:29 阅读更多 →
影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容 1. 认识影刀:什么场景该用RPA采小说数据 起点中文网的页面结构相对稳定——分类榜单、书籍详情、章节内容三块独立页面,跳转链路清晰。这种场景非常适合影刀自动化&#x…

2026/10/14 3:29:58 阅读更多 →

月新闻

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/15 0:14:36 阅读更多 →
Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/14 22:45:47 阅读更多 →
黑夜航拍船只数据集训练YOLOV5模型全流程解析

黑夜航拍船只数据集训练YOLOV5模型全流程解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/14 7:53:34 阅读更多 →