C:二维数组上的嵌套循环产生意外结果

C:二维数组上的嵌套循环产生意外结果,c,arrays,multidimensional-array,cs50,C,Arrays,Multidimensional Array,Cs50,这是该问题的一个最小可复制示例。 将高度和长度作为参数(而不是计算它们)是经过深思熟虑的 typedef struct { int red; } triple; int main(void) { triple array[3][3] = { { {.red = 10}, {.red = 40}, {.red = 70}}, { {.red = 110}, {.red = 120}, {.red = 130}}, { {.red = 200},

这是该问题的一个最小可复制示例。 将高度和长度作为参数(而不是计算它们)是经过深思熟虑的

typedef struct
{
    int red;
} triple;

int main(void)
{
    triple array[3][3] = {
      { {.red = 10}, {.red = 40}, {.red = 70}},
      { {.red = 110}, {.red = 120}, {.red = 130}},
      { {.red = 200}, {.red = 220}, {.red = 240}}
    };

printarray(2, 2, array);
}


void printarray(int height, int length, triple array[][length])
{
    for (int i = 0; i < height; i++)
    {
        for (int j = 0; j < length; j++)
        {
            printf("red score at array[%i][%i] = %i\n", i, j, array[i][j].red);
        }
    }
}
typedef结构
{
红色;
}三重;
内部主(空)
{
三重阵列[3][3]={
{{.red=10},{.red=40},{.red=70},
{{.red=110},{.red=120},{.red=130},
{{.red=200},{.red=220},{.red=240}
};
打印阵列(2,2,阵列);
}
void printary(整数高度、整数长度、三元组[][长度])
{
对于(int i=0;i
我得到的输出是:
数组[0][0]=10时的红色分数
数组[0][1]处的红色分数=40
数组[1][0]处的红色分数=70
数组[1][1]的红色分数=110

但我希望:
数组[0][0]=10时的红色分数
数组[0][1]处的红色分数=40
数组[1][0]处的红色分数=110
数组[1][1]处的红色分数=120


2d数组的索引显然没有像我预期的那样工作,但是为什么?

您正在将
2,2
传递到
printary
。这是高度和长度

但是,数组的长度定义为
3
。因此,必须将
3
传递到
printarray
作为长度

否则,
printary
中的索引不正确。如您所知,
printary
中的数组相当于
triple array[2][2]
而不是所需的
triple array[3][3]

高度可以小于定义的高度,但
长度必须匹配。这里,
length
是步幅。这是给定行中的元素数

因此,在
main
中,调用:
printarray(3,3,array)


如果您确实希望打印数组的一个子部分,则需要为跨步向
printarray
传递一个单独的变量

该函数必须声明为:

void printarray(int height, int length, int stride, triple array[][stride])
然后,在
main
中,使用以下命令调用它:

printarray(2,2,3,array);

问题在于调用
printary

printary(2,2,array);
告诉函数数组有两行两列,但它没有,它有三行三列。编译器假定您不会说谎

必须使用
length
参数的正确值调用函数,因为编译器使用该参数推断如何计算元素
数组[i][j]
的偏移量

如果只想打印该数组的一部分,则应将要打印的列数和行数指定为函数的额外参数,如下所示:

void printary(整数高度、整数长度、整数nrows、整数ncols、三元组[][length])
{
如果(nrows>高度)nrows=高度;
如果(ncols>width)ncols=width;//防止出现错误情况!
对于(int i=0;i
然后像这样调用函数:

printary(3,3,2,2,array);
注意:在使用前,您还缺少for
printary
,这在某些编译器上是一个错误(但在其他编译器上只是一个警告);将此行添加到
main
函数之前的某个位置:

void printary(int-height、int-length、int-nrows、int-ncols、triple-array[][length]);

是的,当然这就是问题所在,我怎么能看不到呢。谢谢:)非常感谢你的指导,我意识到我的问题并解决了它