如何将100元素的C语言数组拆分为20元素连续滑动子数组?
最优实现方案:无复制的指针引用法
对于你的需求,最优方案是直接用指针/数组指针引用原数组的连续元素,而非创建新数组复制数据——这能做到零额外内存开销、O(1)级别的子数组访问效率,完全匹配你的切片需求。
核心思路
所有子数组都是原数组的连续切片,没必要复制元素。只需要存储每个子数组的起始指针,就能通过指针直接访问原数组的对应区间。
代码实现
第一步:初始化原数组
#include <stdio.h> int main() { // 初始化原数组为0-99 int original[100]; for (int i = 0; i < 100; i++) { original[i] = i; }
第二步:创建子数组指针数组
我们用一个指针数组存储每个子数组的起始地址,共需要81个指针(对应array0到array80):
// 定义指针数组,每个元素指向一个子数组的起始位置 int *subarrays[81]; // 遍历赋值每个子数组的起始指针 for (int k = 0; k <= 80; k++) { subarrays[k] = &original[k]; }
第三步:使用子数组
通过subarrays[index][offset]即可访问对应子数组的元素,比如:
// 示例:访问array0的第10个元素(值为10) printf("array0[10] = %d\n", subarrays[0][10]); // 示例:访问array80的第19个元素(值为99) printf("array80[19] = %d\n", subarrays[80][19]); return 0; }
为什么这是最优?
- 内存效率拉满:不需要额外分配81×20个int的内存,只需要存储81个指针(64位系统下仅占648字节),内存开销可以忽略。
- 时间效率极高:仅需81次指针赋值操作,时间复杂度近乎O(1),远快于复制元素的O(N)操作。
- 数据一致性:原数组修改后,所有子数组的引用会同步更新,避免多副本的数据不一致问题。
注意事项
- 确保原数组的生命周期长于子数组指针的生命周期:如果原数组是栈上的局部变量,不要将
subarrays指针数组返回给函数外部,否则会出现野指针。 - 如果你的业务场景需要独立的子数组副本(修改子数组不影响原数组),才需要用
memcpy复制元素,但这显然不是最优方案,仅作为特殊场景的备选:// 备选:复制元素到独立子数组(仅特殊场景用) int subarrays_copy[81][20]; for (int k = 0; k <= 80; k++) { memcpy(subarrays_copy[k], &original[k], 20 * sizeof(int)); }
内容的提问来源于stack exchange,提问作者werner
相关产品推荐
相关产品推荐

