2017-08-28 156 views
0

这是我在C中的第一个编程。在printGrid()函数中,我试图给2D数组分配一些值,并且2D数组中的其余点只分配0。一个数组,它按预期工作。但是,当我使用display()函数打印出整个数组时,它无法正常工作,数组中的所有值均为0.在发布问题之前,我花了几个小时来完成搜索和调试这里。有人可以帮我解决这个问题吗?谢谢。为什么2D数组总是在C中输出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"); 

} 
+1

因为'&height'总是相同的值,'grid [i] [j] =&height'不会像你期望的那样工作。 – ymonad

+0

添加预期发布的命令行和输出示例。 ('center =(char)(atoi(argv [center_x_index + 2]) - 4); argv [center_x_index + 2] =&center;':我不认为它可以正常工作,即使预期会发生什么。) – BLUEPIXY

+1

请缩进您的代码并尝试发布[MCVE](https://stackoverflow.com/help/mcve),而不是整个程序。此外,[不要使用'atoi'](https://stackoverflow.com/q/17710018/995714) –

回答

1

此行声明INT 指针的二维数组:

int *grid[5][5];

我觉得你只是想的整数二维数组:

int grid[5][5];

问题是,当您将指针&height指定给其中一个指针时,它会将相同的事物分配给它们中的每一个;您的height变量的地址。在将其分配给阵列后更改height时,您将更改将出现在阵列中每个单个插槽中的值,因为它们都引用原始的height变量。如果使用二维整数数组,而只是分配height,则该值将被复制,并且您将避免此问题。

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的定义后,您可能还需要更新一些其他代码。