You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何将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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.17 12:01:20