传递可变大小的多维数组

Posted

技术标签:

【中文标题】传递可变大小的多维数组【英文标题】:Passing a multidimensional array of variable size 【发布时间】:2016-04-06 04:19:44 【问题描述】:

我试图了解将多维数组传递给 c 中的函数的“最佳实践”(或实际上任何实践)是什么。当然这取决于应用程序,所以让我们考虑编写一个函数来打印一个可变大小的二维数组。特别是,我对如何在以下代码中编写函数 printArry(__, int a, int b) 感兴趣。我省略了第一个参数,因为我不确定应该是什么。

void printArry(_____, int a, int b)
/* what goes here? */



int main(int argc, char** argv)

int a1=5;
int b1=6;
int a2=7;
int a2=8;

int arry1[a1][b1];
int arry2[a2][b2];

/* set values in arrays */

printArry(arry1, a1, b1);
printArry(arry2, a2, b2);


【问题讨论】:

我已经在***.com/questions/34560001/…发布了后续跟进 【参考方案1】:

最简单的方法是(对于 C99 及更高版本)

void printArry(int a, int b, int arr[a][b])
    /* what goes here? */

但是,还有其他方法可以解决

void printArry(int a, int b, int arr[][b])
    /* what goes here? */

void printArry(int a, int b, int (*arr)[b])
    /* what goes here? */

编译器会将前两个调整为第三个语法。因此,从语义上讲,这三个都是相同的。

还有一点点confusing,它只能用作函数原型:

void printArry(int a, int b, int arr[*][*]);

【讨论】:

我从来不知道int arr[a][b] 是一个选项作为参数;这是什么时候出现在标准中的? @hacks。另一种也是将 2D 的引用作为 1D 指针传递(不推荐)。 我喜欢第二/第三个例子,因为使用它只需要知道二维数组的宽度。 @ABD;我附上了答案的链接。阅读接受的答案以获取详细说明。 前 3 个选项都具有相同的语义含义,我认为这将有助于一般读者在问题中涵盖这一点。 (前两个调整为int (*arr)[b])。但是,我会使用第一个作为其自我记录价值。还建议 C2X 弃用 * 版本【参考方案2】:

这不是一个真正的答案,而是对 OP 的评论问题的扩展评论,“你可以在不知道行数的情况下传递数组,但是你怎么知道何时停止打印行?”

回答:通常,您不能不传递数组大小。看看这个一维示例,它破坏了数组大小。

#include <stdio.h>

int procarr(int array[16], int index)

   return array[index];


int main (void)

    int arr[16] = 0;
    printf("%d\n", procarr(arr, 100));
    return 0;

程序输出(尽管所有元素都初始化为0):

768

那是未定义的行为,并且没有编译器警告。 C 不提供任何数组溢出保护,除了数组定义初始化器(尽管这样的初始化器可以定义数组长度)。您也必须传递数组大小,如

#include <stdio.h>

int procarr(int array[16], size_t index, size_t size)

    if (index < size)
        return array[index];
    return -1;                  // or other action / flag


int main (void)

    int arr[16] = 0;
    printf("%d\n", procarr(arr, 100, sizeof arr / sizeof arr[0]));
    return 0;

程序输出:

-1

【讨论】:

以上是关于传递可变大小的多维数组的主要内容,如果未能解决你的问题,请参考以下文章

包含具有可变形状的多维 numpy 数组的 numpy 数组

JavaScript:自动对可变多维数组进行对角排序

参数传递之传递多维数组

多维数组

将多维数组传递给函数 C

按子数组的大小对多维数组进行排序