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

C语言中如何创建列数未知的7行矩阵存储规则生成的表格数据

解决C语言中动态列数矩阵存储问题

核心思路

C语言无法直接声明列数不固定的静态二维数组,因此采用指针数组+动态内存分配的方案:

  • 先计算每个表格的元素总数,确定每行所需内存大小
  • 为每行单独分配对应容量的内存
  • 将原有的打印逻辑改为向数组写入数据

步骤实现

1. 辅助函数:计算每个表格的元素数量

先实现一个函数统计每行的元素个数,避免重复计算逻辑:

int count_table_elements(int table_num) {
    if (table_num == 7) {
        // Table7:从64到100,共37个数字
        return 100 - 64 + 1;
    }
    int start = 1 << (table_num - 1); // 用位运算替代pow(2, n),避免浮点数精度问题
    int step = 1 << table_num;        // 显示+跳过的总步长:2^table_num
    int count = 0;
    int current = start;
    
    while (current <= 100) {
        int display_count = start;
        // 最后一段可能不足start个,取剩余数字数
        if (current + display_count - 1 > 100) {
            display_count = 100 - current + 1;
        }
        count += display_count;
        current += step;
    }
    return count;
}

2. 创建动态矩阵并填充数据

#include <stdio.h>
#include <stdlib.h>

int count_table_elements(int table_num) {
    if (table_num == 7) {
        return 100 - 64 + 1;
    }
    int start = 1 << (table_num - 1);
    int step = 1 << table_num;
    int count = 0;
    int current = start;
    
    while (current <= 100) {
        int display_count = start;
        if (current + display_count - 1 > 100) {
            display_count = 100 - current + 1;
        }
        count += display_count;
        current += step;
    }
    return count;
}

int main() {
    // 声明指针数组,每个元素指向一行的首地址
    int *matrix[7];
    // 记录每行的元素个数,方便后续遍历
    int row_sizes[7];

    // 为每行分配内存并填充数据
    for (int table_num = 1; table_num <= 7; table_num++) {
        int row_idx = table_num - 1;
        row_sizes[row_idx] = count_table_elements(table_num);
        
        // 分配对应大小的内存
        matrix[row_idx] = (int *)malloc(row_sizes[row_idx] * sizeof(int));
        if (matrix[row_idx] == NULL) {
            printf("内存分配失败\n");
            return 1;
        }

        int elem_idx = 0; // 当前行的元素索引
        if (table_num == 7) {
            // 处理Table7
            for (int num = 64; num <= 100; num++) {
                matrix[row_idx][elem_idx++] = num;
            }
        } else {
            int start = 1 << (table_num - 1);
            int step = 1 << table_num;
            int display_count = start;
            
            for (int num = start; num <= 100; num += step) {
                // 写入当前段的数字
                for (int i = 0; i < display_count; i++) {
                    int current_num = num + i;
                    if (current_num > 100) break;
                    matrix[row_idx][elem_idx++] = current_num;
                }
            }
        }
    }

    // 测试输出矩阵内容
    for (int i = 0; i < 7; i++) {
        printf("Table %d:\n", i + 1);
        for (int j = 0; j < row_sizes[i]; j++) {
            printf("%3d ", matrix[i][j]);
            // 每10个数字换行,提升可读性
            if ((j + 1) % 10 == 0) printf("\n");
        }
        printf("\n\n");
        // 使用完后释放内存,避免泄漏
        free(matrix[i]);
    }

    return 0;
}

关键细节说明

  • 位运算替代pow:pow(2, n)返回浮点数,可能出现精度误差(比如pow(2,6)可能返回63.999999,转int后变成63),用1 << n做整数运算更高效准确。
  • 内存管理:动态分配的内存必须用free释放,否则会造成内存泄漏。
  • row_sizes数组:记录每行的元素数量,是遍历矩阵的必要依据,因为无法通过指针直接获取动态数组的长度。

替代方案:连续内存的二维动态数组

如果需要整个矩阵在内存中连续存储,可以用以下方式(复杂度稍高,日常场景推荐指针数组方案):

// 先计算总元素数
int total_elements = 0;
for (int i = 0; i < 7; i++) {
    total_elements += row_sizes[i];
}
// 分配连续内存
int *matrix = (int *)malloc(total_elements * sizeof(int));
// 通过偏移量访问每行:第i行起始位置 = matrix + 前i行元素总数之和

内容的提问来源于stack exchange,提问作者Ravened-Clock

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.08 05:01:33