这是我在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");
}
答案 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
变量。如果您使用二维整数数组,只需指定[]
,那么将复制该值,您将避免此问题。