如何向函数传递任意大小的二维数组?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
相关产品推荐
相关产品推荐

