c - 二维数组元素设置后发生变化

标签 c arrays multidimensional-array cs50

下面的程序旨在根据用户输入的尺寸打印整数方形网格(作为 edx 上哈佛 cs50 类(class)的一部分)。

数组正在正确初始化,但是当打印出来时,最后一列总是打印不正确。我尝试通过在 init() 函数的最里面的 for 循环中放置 2 个 printf 语句来进行调试。 似乎在最外层循环运行一次后,最后一列中的条目就会减一,尽管在此之前它是正确的。

为什么会发生这种情况?打印不应该正确吗?

#include <stdio.h>

 main()
{
    void init(int dim, int arr[dim-1][dim-1]);
    int dim;
    printf("Enter board dimension(max 10): ");
    scanf("%d", &dim);

    int arr[dim-1][dim-1];

    init(dim, arr);

    int i,j;    
    for(i=0;i<dim;i++)
    {
        for(j=0;j<dim;j++)
        {
            printf("%2d  ",arr[i][j]);
        }
        printf("\n");
    }   
}

void init(int dim, int arr[dim-1][dim-1])
{
    int i,j,p;
    for(i=0;i<dim;i++)
    {
        for(j=0;j<dim;j++)
        {
            arr[i][j] = (dim*dim-1)-i*dim-j;
        }   
            for(p=0;p<dim;p++)
            {
                printf("%d ", arr[i][p]);
                if(i>=1)
                printf("%d ", arr[i-1][p]);
            }   

    }
    printf("\n");
    if(dim%2==0)
    {
        arr[dim-1][dim-3] = 1;
        arr[dim-1][dim-2] = 2;
    }
}

编辑:现在应该编译

最佳答案

您可以使用a[dim - 1][dim - 1]定义数组,它比所需的维度少一维。如果用户输入“4”,您将创建一个 3×3 数组。

您的数组是二维且长度可变的。因此,您必须在函数中将维度与数组一起传递,至少对于最后一个维度而言。你这样做是正确的,但是 'init 中的代码表现得好像数组是a[dim][dim],而实际上它是a[dim - 1][dim - 1]`。

使用实际维度 dim 定义数组,并访问索引 0dim - 1 的元素。这通常是在如下循环中完成的:

for (int i = 0; i < dim; i++) ...

看到 >=dim - 1 类似的东西应该让你警惕。

您的程序现在如下所示:

#include <stdio.h>

void init(int dim, int arr[dim-1][dim-1]);
void print(int dim, int arr[dim-1][dim-1]);

int main(void)
{
    int dim;

    printf("Enter board dimension: ");
    scanf("%d", &dim);

    int arr[dim][dim];

    init(dim, arr);
    print(dim, arr);

    return 0;
}

void print(int dim, int arr[dim][dim])
{
    int i,j; 

    for(i = 0; i < dim; i++) {
        for(j = 0; j < dim; j++) {
            printf("%2d  ", arr[i][j]);
        }
        printf("\n");
    }
}

void init(int dim, int arr[dim][dim])
{
    int i, j;

    for(i = 0; i < dim; i++) {
        for(j = 0; j < dim; j++) {
            int ii = dim - 1 - i;
            int jj = dim - 1 - j;

            arr[i][j] = ii*dim + jj;
        } 
    }
}

关于c - 二维数组元素设置后发生变化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46449067/

相关文章:

c - 如何检测ODBC DB2连接编码(代码页)

Javascript:如何从数组中清除未定义的值

javascript - 为什么不需要的数据被推送到我的数组中?

PHP:多维数组元素的串联

c - Linux waitid 中__WALL 的使用

c - <string.h> 和 <strings.h> 的区别

c - UVa-401 :Palindromes, 超出输出限制

php - 循环遍历 mysqli 结果数组一次以获取所有信息

java - 二维方 block 游戏 : Each tile as an object impractical?

ruby - 如何选择第一个内部数组?