C 充满垃圾数据的二维数组。。。有时

C 充满垃圾数据的二维数组。。。有时,c,arrays,pointers,initialization,C,Arrays,Pointers,Initialization,我一直在HackerRank从事简单的编码挑战。我决定将我的解决方案实现为一个C函数,因为任何用另一种语言或在主函数本身中进行的操作都显得微不足道。我认为这样做会弄乱数组/指针语法好几次,我有机会学到一些东西 这是我的职责: int sum_diagonal(int n, int (*arr)[n]) { int lD, rD, sum; for(int i = 0; i < n; ++i) { for(int j = 0; j < n; ++j) {

我一直在HackerRank从事简单的编码挑战。我决定将我的解决方案实现为一个C函数,因为任何用另一种语言或在主函数本身中进行的操作都显得微不足道。我认为这样做会弄乱数组/指针语法好几次,我有机会学到一些东西

这是我的职责:

int sum_diagonal(int n, int (*arr)[n]) {
   int lD, rD, sum;
   for(int i = 0; i < n; ++i) {
       for(int j = 0; j < n; ++j) {
           if (i == j) {
                rD += arr[i][j];
           }
           if ((i+j) == (n-1)) {
                lD += arr[i][j];
           }
       }
   }
   sum = abs(lD - rD);
   return sum;
}

有时它完全按照预期工作,有时我得到垃圾输出。然而,更奇怪的是,如果我取消注释main函数中的random
printf()
调用,它似乎每次都能工作。发生了什么事?

在代码中,您已经定义了

 int lD, rD, sum;
没有初始化,然后,你写了

 rD += arr[i][j];

rD
lD
是自动局部变量,未初始化。在第一次迭代本身中,您将使用它们作为从中读取值(即
+=
的LHS)

此时,它们的内容(值)是不确定的。正如您所做的那样,使用它们可以调用

解决方案:始终初始化局部变量,如

 int lD = 0, rD = 0, sum= 0;

您正在尝试使用非常量值(n)来设置数组的大小。这在C语言中不起作用。如果需要灵活的数组大小,应该使用malloc()来分配内存

int n; 
scanf("%d",&n); 
int a[n][n]; //n is a non-constant value. 
否则,您可以通过使用#define来使用数组的固定大小,例如:

#define SIZE_OF_ARRAY 5

int a[SIZE_OF_ARRAY ][SIZE_OF_ARRAY ];

我认为那是不对的。n的值是在创建数组时定义的,因为它已被scanf函数读入内存。代码编译正确,但有时会给出随机垃圾数据,第一个答案解决了问题。一个愚蠢的错误,哦,好吧。我只是认为我把矩阵传递到函数中犯了一个错误,于是就专心致志地去寻找它。我很想知道为什么printf调用能让它工作。有趣的是,我尝试了它,它在本地使用gcc,但在hackerrank使用的任何编译器中都不起作用。
int n; 
scanf("%d",&n); 
int a[n][n]; //n is a non-constant value. 
#define SIZE_OF_ARRAY 5

int a[SIZE_OF_ARRAY ][SIZE_OF_ARRAY ];