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

如何向函数传递任意大小的二维数组?C语言方案探讨

向函数传递任意大小二维数组的问题

我希望能向函数传递任意大小的二维数组,先看下面的示例代码:

#define MAX_ROWS 8
#define MAX_SIZE 32

static void foo(char array[][MAX_SIZE], size_t max_rows, size_t max_size) {
    for (size_t i = 0; i < max_rows; i++) {
        printf("%s\n", array[i]);
    }
}

int main(void) {
    char array[MAX_ROWS][MAX_SIZE];
    
    for (size_t i = 0; i < MAX_ROWS; i++) {
        snprintf(array[i], MAX_SIZE, "Row: %d", i);
    }
    
    foo(array, MAX_ROWS, MAX_SIZE);
    
    return 0;
}

A. 现有方案的弊端

这段代码能正常运行,但我对函数定义static void foo(char array[][MAX_SIZE], size_t max_rows, size_t max_size)很不满意:不仅要重复指定最大尺寸,还得把第二维度的最大尺寸硬编码进去,才能让编译期处理通过。

B. 变长数组(VLA)方案的纠结

另一种方案是用变长数组(VLA),需要调整参数顺序,让size_t max_size出现在数组参数前面:

static void foo(size_t max_rows, size_t max_size, char array[][max_size])
// 调用方式
foo(MAX_ROWS, MAX_SIZE, array);

我对这个方案又喜又忧:它属于C99标准,但MSVC不支持,没法用;而且就算用宏常量固化了尺寸,也不确定这种方案会不会因为安全问题不被推荐。

C. 缓冲区拷贝方案的段错误问题

我知道char array[MAX_ROWS][MAX_SIZE]本质上就是一块大小为max_rows * max_size * sizeof(char)的缓冲区,所以尝试了下面的方案,但运行会触发段错误:

static void foo(void *array0, size_t max_rows, size_t max_size) {
    size_t total_size = max_rows * max_size * sizeof(char);
    
    char *array = malloc(total_size);
    memcpy(array, array0, total_size);

    for (size_t i = 0; i < max_rows; i++) {
        printf("%s\n", array[i]);
    }

    free(array);
}

内容的提问来源于stack exchange,提问作者Tintenfisch

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.11 04:42:11