为什么2D数组总是在C中打印出0?

时间:2017-08-28 02:48:25

标签: c arrays

这是我在C中的第一次编程。在printGrid()函数中,我尝试为2D数组分配一些值,而2D数组中的其余部分只分配0.我会在分配值后立即对其进行测试到一个数组,它按预期工作。但是,当我使用display()函数打印出整个数组时,它无法正常工作,数组中的所有值都为0.我发布了一个问题之前,我花了几个小时进行搜索并自行调试这里。有人可以帮我解决这个问题吗?感谢。

#include <stdio.h>
#include <stdlib.h>

const int max_height = 4;

int height; //the height of pile
int center_x_index, center_y_index; //index of input parameter that is center of the plane
int unstable;
int drop_status;
int *grid[5][5];


int is_stable(int total_param, char *piles[]);
void display(int *grid[5][5]);

/*
Function to print out the 23*23 grid with given number of piles
*/

void printGrid(int total_param, char *piles[])
{
    int i, j, k, size, assigned;
    size = 5;

    for (i = 0; i < size; i++)
    {
        for (j = 0; j < size; j++)
        {
            for (k = 1; k < total_param; k = k + 3)
            {
                if ((atoi(piles[k]) == i) && (atoi(piles[k + 1]) == j))
                {
                    height = atoi(piles[k + 2]);

                    //find the central pile of the plane and drop a grain of sand onto this pile.
                    if ((i == j) && i == (size / 2))
                    {
                        center_x_index = k;
                        center_y_index = k + 1;
                        if (drop_status > 0 && is_stable(total_param, piles))
                        {
                            drop();
                        }

                    }
                    grid[i][j] = &height; //store value into 2D array
                    //printf("2D array: %d", *grid[i][j]);
                    printf("%d", height);
                    assigned = 1;
                    break;
                }
                else
                {
                    assigned = 0;
                }


            }
            if (assigned != 1)
            {
                height = 0;
                grid[i][j] = &height;
                printf("%d", 0);
            }

        }
        printf("\n");


    }

}


void display(int *grid[5][5])
{
    int i, j;
    for (i = 0; i < 5; i++)
    {
        for (j = 0; j < 5; j++)
        {
            printf("%d", *grid[i][j]);
        }
        printf("\n");
    }
}


int main(int argc, char *argv[])
{

    printGrid(argc, argv);

    printf("\n");

}

2 个答案:

答案 0 :(得分:2)

您可能想要研究C中的指针。例如,请参阅this

这一行

int *grid[5][5];

指针的2D数组声明为整数。

这一行

grid[i][j] = &height; //store value into 2D array

将变量height地址存储到该grid元素。在那个时间点height是您期望的值,但是在循环的下一次迭代中,您将覆盖它。

所以最后你会让grid中的每个元素指向同一个变量height。这一行

printf("%d", *grid[i][j]);

取消引用 grid[i][j]处的指针,即它跟随指向变量height的指针并使用其值。由于此时height为零且每个grid元素都指向它,因此会打印出所有零。

您需要做的是将grid声明为int的二维数组:

int grid[5][5];

为其分配height的值而不是其地址:

grid[i][j] = height; //store value into 2D array

并直接使用其值而不是取消引用它:

printf("%d", grid[i][j]);

在更改grid的定义后,您可能还需要更新其他一些代码。

答案 1 :(得分:1)

这一行声明了一个int 指针的二维数组

int *grid[5][5];

我想你只想要一个整数的二维数组:

int grid[5][5];

问题在于,当您将指针&height分配给其中一个指针时,它会为每个指针分配相同的内容;您height变量的地址。在将height分配给数组后更改height时,您将更改将出现在数组中每个插槽中的值,因为它们都引用了原始的height变量。如果您使用二维整数数组,只需指定[],那么将复制该值,您将避免此问题。