问题 传递可变大小的多维数组


我试图理解将多维数组传递给c中的函数的“最佳实践”(或实际上是任何实践)是什么。当然这取决于应用程序,因此我们考虑编写一个函数来打印可变大小的2D数组。特别是,我对如何编写函数感兴趣 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);

}

7731
2018-01-01 19:17


起源

我发布了一个跟进: stackoverflow.com/questions/34560001/... - ABD


答案:


最简单的方法是(对于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? */
}   

还有一点点 扑朔迷离 这将只作为功能原型

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

14
2018-01-01 19:19



我一直都不知道 int arr[a][b] 是一个选项作为参数;什么时候出现在标准中? - abligh
@abligh;自C99。 - haccks
你生活和学习。谢谢。 - abligh
我喜欢第二个/第三个例子,因为只需要知道2-D数组的宽度就可以使用它。 - Weather Vane
@ABD;我附上了答案的链接。阅读接受的答案以获得详细说明。 - haccks


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

答:一般情况下,你不能没有通过数组大小。看看这个1-D示例,它打破了数组大小。

#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

1
2018-01-01 19:51