C语言数组合并:动态内存分配与memcpy高效实现详解
1. 项目概述从“合并”说起在C语言的日常开发里处理数组是家常便饭。今天聊的这个话题——“两个数组合并为一个数组”听起来简单得像是教科书第一章的课后习题但真要在实际项目里把它写得健壮、高效、可维护里头的门道可不少。我见过不少新手甚至一些有经验的开发者一上来就写个循环硬拷贝结果不是数组越界就是内存泄漏调试半天。这个操作的背后远不止是memcpy或者一个for循环那么简单。它涉及到内存管理的核心思想、算法效率的权衡以及代码在面对边界情况时的鲁棒性。简单说这个项目要解决的就是给定两个已知大小和内容的数组比如int a[] {1, 2, 3};和int b[] {4, 5};我们需要创建一个新的数组按顺序容纳这两个数组的所有元素最终得到{1, 2, 3, 4, 5}。这不仅是数据处理的基本功更是理解C语言中“数据集合”操作、指针运算和动态内存管理的绝佳切入点。无论你是正在啃《C Primer Plus》的学生还是需要处理底层数据聚合的嵌入式工程师掌握几种可靠的数组合并方法都能让你的代码更加扎实。2. 核心思路与方案选型不止一种“合并法”接到“合并两个数组”的需求我们的第一反应往往是开一个新数组把两个旧数组的内容依次放进去。这个思路没错但具体怎么“开”、怎么“放”不同的选择直接决定了代码的质量和适用场景。我们不能只满足于功能实现更要思考每种方法背后的代价和约束。2.1 静态合并简单场景的快速方案最直观的方法是使用静态数组。前提是你必须在编译时就知道合并后数组的总大小。例如你知道数组A有3个元素数组B有5个元素那么合并后的数组大小就是8。你可以直接定义int result[8];。这种方法的好处是极致的简单和快速内存分配在栈上没有动态管理的开销。代码写起来也直白先拷贝A再拷贝B。但是它的局限性非常明显缺乏灵活性。一旦两个源数组的大小在运行时发生变化比如来自用户输入或文件读取这个写死的8就失效了。如果实际数据超过了预留空间会导致缓冲区溢出这是严重的安全隐患如果远小于预留空间则会造成内存浪费。因此静态合并仅适用于那些数组大小恒定、且已知的微小场景比如硬编码的配置表合并。2.2 动态合并通用场景的推荐实践对于绝大多数实际情况我们更推荐使用动态内存分配。核心步骤是计算总大小size_total size_a size_b。申请内存使用malloc或calloc在堆上分配恰好能容纳所有元素的内存块。分段拷贝将两个源数组的数据依次拷贝到新分配的内存中。管理生命周期使用完毕后需调用free释放内存防止泄漏。动态合并的优势在于强大的灵活性。无论源数组的大小如何变化我们都能在运行时精确地分配所需内存做到“按需分配”。这是处理用户数据、文件内容或网络数据包等不确定数据规模的唯一可靠方法。当然它引入了动态内存管理的责任开发者必须小心地配对使用malloc和free。2.3 “原地”合并与有序合并进阶的思考有时问题会变得更复杂。比如如果要求“将数组B合并到数组A的末尾”并且数组A有足够的预留空间这就变成了“原地合并”。这时我们需要谨慎地处理内存重叠的问题如果使用memcpy源和目标内存重叠会导致未定义行为应使用memmove。另一种常见的变体是“合并两个已排序的数组并保持结果有序”。这就不再是简单的拼接而是需要用到类似归并排序中的“双指针”或“归并”算法。虽然这超出了基础合并的范围但它提醒我们“合并”这个操作可以根据业务逻辑衍生出多种形态关键在于准确理解需求。注意选择方案时第一个要问的问题就是“数组的大小在编译时是否已知且固定”如果答案是肯定的可以考虑静态方案以求简单高效如果是否定的那么动态内存分配是必经之路。第二个要问的问题是“合并后的数据需要保持某种顺序如有序吗”这决定了你的拷贝逻辑是简单的拼接还是需要比较插入。3. 核心细节解析与实操要点确定了动态合并的大方向后我们来深入拆解其中的每一个技术细节。这些细节是代码能否正确、高效运行的关键也是区分“能跑”的代码和“健壮”的代码的分水岭。3.1 内存分配malloc、calloc与realloc的选择malloc(size)和calloc(num, size)都能分配内存但有一点重要区别malloc分配的内存内容是未初始化的可能是垃圾值而calloc会将分配的内存全部初始化为0。在数组合并的场景下如果我们分配内存后立即用有效数据覆盖全部空间那么使用malloc效率稍高因为它省去了归零的步骤。但如果你希望合并后的数组剩余部分如果存在有一个确定的初始状态calloc更安全。realloc通常用于扩展已有数组的大小在“原地合并”的变体中可能用到。但这里有一个巨大的坑realloc可能会移动内存块到新的地址。这意味着如果你有多个指针指向旧的内存块在realloc之后除了接收返回值的那个指针其他指针都会变成“野指针”。在合并操作中除非你非常清楚自己在做什么否则我更建议直接为结果分配一块全新的内存而不是尝试对其中一个源数组进行realloc。实操心得我个人的习惯是对于纯粹的、一次性的数组合并使用malloc。并在分配后立即检查返回值是否为NULL这是动态内存操作必须养成的条件反射。3.2 数据拷贝memcpyvs. 循环赋值将数据从源数组复制到目标数组有两种主流方式使用标准库函数memcpymemcpy(dest, src, n)其中n是要拷贝的字节数。它的优势是经过高度优化通常比手写循环快得多尤其是处理大块数据时。使用for循环逐个元素赋值for(i0; isize_a; i) result[i] a[i];。这种方式更直观易于调试并且在拷贝过程中可以方便地插入额外的逻辑比如转换、过滤。如何选择在绝大多数情况下我强烈推荐使用memcpy。理由如下性能memcpy通常由编译器或C库利用底层硬件特性如SIMD指令实现速度极快。简洁一行代码代替一个循环意图更清晰。正确性避免了手写循环时可能出现的索引错误。使用memcpy的关键在于正确计算第三个参数——字节数。一个常见的错误是直接传入元素个数。正确的做法是元素个数 * sizeof(元素类型)。例如拷贝一个包含5个整数的数组memcpy(dest, src, 5 * sizeof(int))。注意事项必须确保源内存和目标内存区域不重叠。如果它们可能重叠例如在“原地合并”时必须使用memmove函数该函数会正确处理重叠情况当然性能会有轻微损耗。3.3 指针运算另一种优雅的拷贝视角除了使用数组索引[]我们还可以完全使用指针来完成合并操作。这种方式更贴近C语言的底层思维有时看起来更简洁。int *ptr result; // 指向结果数组起始位置 // 拷贝第一个数组 for(int *p a; p a size_a; p) { *ptr *p; } // 拷贝第二个数组 for(int *p b; p b size_b; p) { *ptr *p; }指针运算的核心是知道指针加减一个整数时移动的步长是其指向类型的大小。p会让p指向下一个int。这种方法在遍历时非常高效并且能让你更深刻地理解数组和指针的等价性。对于初学者我建议先用索引方式实现确保逻辑正确再尝试用指针重写作为练习。4. 完整实现与代码剖析下面我将给出一个完整的、工业级的动态数组合并函数实现。这个实现包含了错误处理、内存管理、以及使用memcpy的高效拷贝。我们将它拆解开来逐部分分析。4.1 函数接口设计首先设计一个清晰的函数接口至关重要。它应该明确告诉调用者需要提供什么以及会返回什么。/** * brief 合并两个整数数组 * param arr1 第一个数组 * param size1 第一个数组的元素个数 * param arr2 第二个数组 * param size2 第二个数组的元素个数 * param mergedSize 输出参数返回合并后数组的元素个数 * return 指向新数组的指针。如果内存分配失败返回NULL。 * note 调用者负责使用 free() 释放返回的指针。 */ int* merge_arrays(const int* arr1, size_t size1, const int* arr2, size_t size2, size_t* mergedSize);这个设计有几个优点使用const指针保护源数组数据不被意外修改。使用size_t类型表示大小这是标准库用于表示对象大小的无符号类型能避免负数带来的问题。通过输出参数mergedSize返回结果大小方便调用者后续遍历。在注释中明确指出了内存所有权的转移调用者负责释放。4.2 分步实现与注释#include stdio.h #include stdlib.h #include string.h // 为了使用 memcpy int* merge_arrays(const int* arr1, size_t size1, const int* arr2, size_t size2, size_t* mergedSize) { // 1. 处理边界情况如果其中一个数组为空 if (size1 0 size2 0) { *mergedSize 0; // 可以选择返回NULL也可以返回一个空指针。这里返回一个可free的NULL指针是安全的但更常见的做法是返回NULL。 return NULL; } if (size1 0) { // 仅复制第二个数组 *mergedSize size2; int* result (int*)malloc(size2 * sizeof(int)); if (result NULL) return NULL; memcpy(result, arr2, size2 * sizeof(int)); return result; } if (size2 0) { // 仅复制第一个数组 *mergedSize size1; int* result (int*)malloc(size1 * sizeof(int)); if (result NULL) return NULL; memcpy(result, arr1, size1 * sizeof(int)); return result; } // 2. 计算总大小并分配内存 *mergedSize size1 size2; int* merged_array (int*)malloc((*mergedSize) * sizeof(int)); // 3. 检查内存分配是否成功至关重要 if (merged_array NULL) { *mergedSize 0; // 分配失败将输出大小置为0 fprintf(stderr, 错误内存分配失败\n); return NULL; } // 4. 执行合并拷贝 // 先拷贝第一个数组 memcpy(merged_array, arr1, size1 * sizeof(int)); // 再拷贝第二个数组。注意目标地址的偏移merged_array size1 memcpy(merged_array size1, arr2, size2 * sizeof(int)); // 5. 返回新数组指针 return merged_array; }4.3 使用示例与测试光有函数不够我们还需要知道如何正确地调用和测试它。int main() { int a[] {1, 3, 5, 7}; int b[] {2, 4, 6, 8, 10}; size_t size_a sizeof(a) / sizeof(a[0]); size_t size_b sizeof(b) / sizeof(b[0]); size_t merged_size 0; // 调用合并函数 int* combined merge_arrays(a, size_a, b, size_b, merged_size); // 检查是否成功 if (combined ! NULL) { printf(合并后的数组大小%zu\n, merged_size); for (size_t i 0; i merged_size; i) { printf(%d , combined[i]); } printf(\n); // 关键使用完毕后必须释放内存 free(combined); combined NULL; // 好习惯释放后将指针置为NULL防止误用 } else { if (merged_size 0 size_a size_b 0) { printf(内存分配失败\n); } else { printf(两个源数组都为空。\n); } } // 测试边界情况 printf(\n--- 测试边界情况 ---\n); int* empty_result merge_arrays(NULL, 0, NULL, 0, merged_size); printf(两个空数组合并返回%s\n, (empty_result NULL) ? NULL : 非NULL); return 0; }运行上述代码输出应该是合并后的数组大小9 1 3 5 7 2 4 6 8 10 --- 测试边界情况 --- 两个空数组合并返回NULL5. 常见问题、陷阱与排查技巧即便代码看起来简单在实际编写和调试过程中还是会遇到一些典型的“坑”。下面是我总结的几个常见问题及其解决方案。5.1 内存分配失败未检查这是最严重也最容易被新手忽略的错误。malloc在系统内存不足时会返回NULL。如果直接对NULL指针进行解引用或传递给memcpy程序会立即崩溃段错误。排查与解决养成条件反射每次malloc后都检查返回值。int *ptr (int*)malloc(n * sizeof(int)); if (ptr NULL) { // 处理错误打印日志、返回错误码、清理资源等 fprintf(stderr, 内存分配失败请求大小%zu\n, n * sizeof(int)); return ERROR_CODE; // 或 exit(EXIT_FAILURE); }5.2 内存泄漏分配了内存malloc但在函数返回或程序结束前忘记释放free。对于长期运行的程序如服务器、嵌入式设备内存泄漏会逐渐耗尽所有可用内存导致系统变慢或崩溃。排查与解决纪律谁分配谁释放或者明确所有权转移。在merge_arrays函数中我们在注释和设计上明确了调用者负责释放。工具在Linux/macOS下可以使用valgrind工具检测内存泄漏。在Windows下Visual Studio的调试器也内置了内存泄漏检测功能。代码审查对于每一个malloc都要追踪其对应的free在哪里执行。5.3 计算大小错误错误1malloc(size1 size2)。这分配的是(size1size2)个字节而不是元素。对于int数组这通常只分配了所需内存的1/4假设sizeof(int)4必然导致缓冲区溢出。 错误2memcpy(..., size1)。第三个参数是字节数不是元素个数。少乘了sizeof(int)。排查与解决牢记公式总字节数 元素个数 * sizeof(元素类型)。在malloc和memcpy中坚持使用这个公式。使用size_t类型来存储和计算大小避免溢出。5.4 指针与数组的混淆在函数参数中int arr[]和int *arr是完全等价的。但在函数内部sizeof(arr)得到的是指针的大小如8字节而不是整个数组的大小。因此不能在函数内部用sizeof来计算传入数组的长度长度必须作为另一个参数显式传递。排查与解决这是C语言的经典陷阱。始终记住当数组作为参数传递给函数时它会“退化”为指向其首元素的指针。数组的大小信息必须在函数调用链中显式维护。5.5 多维度数组的合并如果遇到合并二维数组例如矩阵的需求情况会复杂一些。你不能简单地用memcpy整个内存块因为二维数组在内存中是按行连续存储的。合并两个3x3的矩阵为一个6x3的矩阵需要按行进行拷贝。// 假设合并 arr1[size1][COLS] 和 arr2[size2][COLS] 到 result for(int i0; isize1; i) { memcpy(result[i][0], arr1[i][0], COLS * sizeof(int)); } for(int i0; isize2; i) { memcpy(result[size1 i][0], arr2[i][0], COLS * sizeof(int)); }关键在于理解内存布局并正确计算每次memcpy的源地址、目标地址和字节数一行的大小。6. 性能考量与扩展思考对于一个基础操作我们也应该思考其性能瓶颈和优化空间以及如何将其变得更通用。6.1 时间复杂度与空间复杂度我们实现的动态合并方法时间复杂度是O(n)其中n是两个数组的总长度。因为我们需要遍历通过memcpy每个元素一次。这是最优的不可能更快。 空间复杂度也是O(n)因为我们需要额外分配一块与总数据量成正比的内存。这是功能要求决定的也无法优化。真正的性能差异体现在常数因子层面使用memcpy库函数优化比手写循环快确保内存对齐可能让拷贝更快。但这些优化通常由编译器和标准库替我们完成了。6.2 编写通用类型的合并函数上面的例子只处理了int类型。如果我们想合并double数组、char数组甚至结构体数组呢为此我们可以利用void*指针和元素大小作为参数编写一个通用函数。void* merge_arrays_generic(const void* arr1, size_t count1, const void* arr2, size_t count2, size_t element_size, size_t* total_count) { if (element_size 0) return NULL; *total_count count1 count2; if (*total_count 0) return NULL; void* result malloc((*total_count) * element_size); if (result NULL) return NULL; char* dest (char*)result; // char*指针便于按字节计算偏移 const char* src1 (const char*)arr1; const char* src2 (const char*)arr2; memcpy(dest, src1, count1 * element_size); memcpy(dest (count1 * element_size), src2, count2 * element_size); return result; }这个函数可以合并任何类型的数组因为memcpy操作的是内存字节。调用时你需要知道元素类型的大小double* dbl_merged (double*)merge_arrays_generic(arr_d1, cnt1, arr_d2, cnt2, sizeof(double), total);通用函数增强了代码的复用性但损失了一些类型安全性调用者必须确保传入的element_size是正确的。6.3 与C标准库的对比如果你是C开发者可能会想到使用std::vector。vector的合并非常简单std::vectorint vec1 {1,2,3}; std::vectorint vec2 {4,5}; std::vectorint merged; merged.reserve(vec1.size() vec2.size()); // 预分配避免多次扩容 merged.insert(merged.end(), vec1.begin(), vec1.end()); merged.insert(merged.end(), vec2.begin(), vec2.end());C的版本更安全、更简洁因为它自动管理内存。但在嵌入式系统、操作系统内核或对性能和控制权有极致要求的场景中C语言的手动内存管理仍然是不可替代的。理解C语言的数组合并正是理解这些高级抽象底层原理的基石。最后记住一点在C语言中对内存保持敬畏之心总是没错的。每次malloc都要想到free每次使用指针都要确认其有效性每次计算大小时都要核对类型。把这些细节做到位你的“数组合并”代码就能从简单的练习题变成真正可靠的项目基石。

相关新闻

园区网架构设计与HCIP认证技术要点解析

园区网架构设计与HCIP认证技术要点解析

1. 园区网基础概念与HCIP认证价值园区网(Campus Network)是指覆盖企业园区、学校、医院等有限地理区域的专用网络。与广域网相比,园区网具有以下典型特征:覆盖范围通常在几平方公里内采用分层架构(核心层、汇聚层、接入…

2026/8/12 11:13:42 阅读更多 →
NUC 11安装Win10避坑指南:解决VMD驱动与BIOS设置难题

NUC 11安装Win10避坑指南:解决VMD驱动与BIOS设置难题

1. 项目概述:为什么NUC 11装Win10是个“技术活”?最近帮朋友折腾一台全新的英特尔NUC 11,目标很明确:安装纯净的Windows 10系统。听起来是个常规操作,对吧?但如果你还停留在“插上U盘一路下一步”的老观念里…

2026/8/12 11:13:42 阅读更多 →
如何快速解密网易云音乐NCM文件:3步完成音乐格式转换的完整指南

如何快速解密网易云音乐NCM文件:3步完成音乐格式转换的完整指南

如何快速解密网易云音乐NCM文件:3步完成音乐格式转换的完整指南 【免费下载链接】ncmdump 项目地址: https://gitcode.com/gh_mirrors/ncmd/ncmdump 你是否在网易云音乐下载了喜欢的歌曲,却发现只能在官方应用播放?那些加密的NCM文件…

2026/8/12 11:13:42 阅读更多 →

最新新闻

C++飞机大战游戏开发实战:从零构建2D射击游戏完整项目

C++飞机大战游戏开发实战:从零构建2D射击游戏完整项目

1. 项目概述与核心价值提起“飞机大战”,很多人的第一反应可能是童年时在红白机或街机上玩过的那些经典射击游戏。但今天,我们不是来怀旧的,而是要把这份经典,用现代C的工程化思维亲手“锻造”出来。这个项目,远不止是…

2026/8/12 11:59:26 阅读更多 →
Lightning-Browser:重塑Android轻量浏览体验的终极指南

Lightning-Browser:重塑Android轻量浏览体验的终极指南

Lightning-Browser:重塑Android轻量浏览体验的终极指南 【免费下载链接】Lightning-Browser A lightweight Android browser with modern navigation 项目地址: https://gitcode.com/gh_mirrors/li/Lightning-Browser 你是否厌倦了那些臃肿的Android浏览器&a…

2026/8/12 11:59:26 阅读更多 →
2026年南宁做智慧燃气安全监管平台的公司有哪些?

2026年南宁做智慧燃气安全监管平台的公司有哪些?

一年里大半时间又热又潮,汛期一到,内涝和燃气安全就成了摆在同一张考卷上的两道题。南宁地处亚热带,高温高湿加速管网附属设施老化,台风外围带来的强降雨还可能引发井室进水、地基沉降,威胁地下管线安全。这座城市城镇…

2026/8/12 11:59:26 阅读更多 →
AI赋能CodeBlocks:C/C++开发效率提升300%的实战指南

AI赋能CodeBlocks:C/C++开发效率提升300%的实战指南

1. 项目概述:当CodeBlocks遇见AI,一场开发范式的静默革命如果你和我一样,是个在C/C领域摸爬滚打多年的“老码农”,那么CodeBlocks这个名字一定不会陌生。它轻量、开源、跨平台,是无数学生、嵌入式开发者和独立开发者的…

2026/8/12 11:59:26 阅读更多 →
2026年大连做智慧燃气安全监管平台的公司有哪些?

2026年大连做智慧燃气安全监管平台的公司有哪些?

北方的海风吹进老城区,燃气管网也跟着一起"挨冻"。大连地处辽东半岛南端,冬季寒冷且供暖期长,每年十一月到来年三月,居民采暖与炊事用气叠加,燃气负荷冲上全年峰值,保供与保安全的压力同步放大。…

2026/8/12 11:59:26 阅读更多 →
英雄联盟智能辅助工具League Toolkit:如何轻松提升你的游戏体验与胜率

英雄联盟智能辅助工具League Toolkit:如何轻松提升你的游戏体验与胜率

英雄联盟智能辅助工具League Toolkit:如何轻松提升你的游戏体验与胜率 【免费下载链接】League-Toolkit An all-in-one toolkit for LeagueClient. Gathering power 🚀. 项目地址: https://gitcode.com/gh_mirrors/le/League-Toolkit League Tool…

2026/8/12 11:58:25 阅读更多 →

日新闻

Ubuntu 22.04安装与使用tree命令:高效管理Linux目录结构

Ubuntu 22.04安装与使用tree命令:高效管理Linux目录结构

1. 为什么需要一个“目录树”工具?在Linux世界里,尤其是Ubuntu这样的发行版,命令行是很多人的主战场。我们每天都要和文件、目录打交道。ls命令是查看目录内容的首选,它简洁、高效,能列出文件名、权限、大小等关键信息…

2026/8/12 9:33:34 阅读更多 →
博思AI智能体:意图识别、思考链与性能优化的工程实践

博思AI智能体:意图识别、思考链与性能优化的工程实践

在AI应用从“能用”走向“好用”的进程中,系统的响应速度、决策透明度与高并发稳定性是决定用户体验的关键。博思AI智能体近期完成了一次重要的专项优化,聚焦于意图识别、思考链展示与全链路压测三大核心领域,将系统从功能实现推向了工程卓越…

2026/8/12 9:33:34 阅读更多 →
子代理架构:AI智能体任务分解与协同执行的核心原理与实践

子代理架构:AI智能体任务分解与协同执行的核心原理与实践

1. 项目概述:为什么我们需要“子代理”?最近在折腾各种AI应用和自动化流程时,我越来越频繁地遇到一个瓶颈:单个AI智能体(Agent)的能力边界。无论是处理复杂的多步骤任务,还是需要同时调用多个专…

2026/8/12 9:33:34 阅读更多 →

周新闻

5分钟告别提取码焦虑:baidupankey如何智能破解百度网盘资源锁

5分钟告别提取码焦虑:baidupankey如何智能破解百度网盘资源锁

5分钟告别提取码焦虑:baidupankey如何智能破解百度网盘资源锁 【免费下载链接】baidupankey 在线查询网盘提取码(维护中 rm repo) 项目地址: https://gitcode.com/gh_mirrors/ba/baidupankey 你是否曾经在深夜寻找一份重要资料&#x…

2026/8/12 1:11:09 阅读更多 →
如何快速生成中国车牌图片:Python开源工具完整指南

如何快速生成中国车牌图片:Python开源工具完整指南

如何快速生成中国车牌图片:Python开源工具完整指南 【免费下载链接】chinese_license_plate_generator 中国车牌生成器 项目地址: https://gitcode.com/gh_mirrors/ch/chinese_license_plate_generator 中国车牌生成器是一个基于Python的开源项目&#xff0c…

2026/8/12 1:11:09 阅读更多 →
收藏!小白程序员轻松入门大模型,从Harness工程开始实践

收藏!小白程序员轻松入门大模型,从Harness工程开始实践

文章强调学习大模型不应只关注模型本身,而应重视模型外的系统搭建,即Harness。提出AgentModelHarness的实用公式,详细介绍Harness的四个层次:持久化层、执行层、控制层和观察与验证层。文章还探讨了上下文工程、工具设计、AGENTS.…

2026/8/12 1:11:08 阅读更多 →

月新闻

免费解锁百度网盘SVIP加速:macOS用户必备的下载提速终极指南

免费解锁百度网盘SVIP加速:macOS用户必备的下载提速终极指南

免费解锁百度网盘SVIP加速:macOS用户必备的下载提速终极指南 【免费下载链接】BaiduNetdiskPlugin-macOS For macOS.百度网盘 破解SVIP、下载速度限制~ 项目地址: https://gitcode.com/gh_mirrors/ba/BaiduNetdiskPlugin-macOS 还在为百度网盘macOS版的龟速下…

2026/8/11 17:09:45 阅读更多 →
终极ncmdump指南:3分钟实现网易云NCM音乐解密与格式转换

终极ncmdump指南:3分钟实现网易云NCM音乐解密与格式转换

终极ncmdump指南:3分钟实现网易云NCM音乐解密与格式转换 【免费下载链接】ncmdump 项目地址: https://gitcode.com/gh_mirrors/ncmd/ncmdump 还在为网易云音乐下载的NCM格式文件无法在其他播放器播放而烦恼吗?ncmdump解密工具帮你轻松解决这个困…

2026/8/12 1:11:10 阅读更多 →
HarmonyOS 应用开发《掌上英语》第81篇: 智能体卡片:为英语学习 App 打造桌面级学习助手

HarmonyOS 应用开发《掌上英语》第81篇: 智能体卡片:为英语学习 App 打造桌面级学习助手

AgentCard 智能体卡片:为英语学习 App 打造桌面级学习助手适用平台:HarmonyOS 7.0 (API 26 Beta)一、引言 HarmonyOS 7.0(API 26 Beta)新增了 AgentCard 智能体卡片能力,这是继 HMAF(鸿蒙智能体框架&#x…

2026/8/11 17:09:45 阅读更多 →