二维数组充满垃圾数据......有时候

Col*_*son 2 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) {
           if (i == j) {
                rD += arr[i][j];
           }
           if ((i+j) == (n-1)) {
                lD += arr[i][j];
           }
       }
   }
   sum = abs(lD - rD);
   return sum;
}
Run Code Online (Sandbox Code Playgroud)

这是main()调用它的函数(提供输入矩阵的代码):

int main(){
   int n; 
   scanf("%d",&n);
   int a[n][n];
   for(int a_i = 0; a_i < n; a_i++){
      for(int a_j = 0; a_j < n; a_j++){
         scanf("%d", &a[a_i][a_j]);
      }
   }
   //printf("why does this make it work?");
   int sum = sum_diagonal(n,a);
   printf("%d", sum);
   return 0;
}
Run Code Online (Sandbox Code Playgroud)

有时它完全按照预期工作,有时我得到垃圾输出.但是,更奇怪的是,如果我printf()在主函数中取消注释该随机调用,它似乎每次都有效.到底是怎么回事?

Sou*_*osh 6

在您的代码中,您已定义

 int lD, rD, sum;
Run Code Online (Sandbox Code Playgroud)

没有初始化然后,你写道

 rD += arr[i][j];
Run Code Online (Sandbox Code Playgroud)

lD += arr[i][j];
Run Code Online (Sandbox Code Playgroud)

rD并且lD是自动局部变量并且未初始化.在第一次迭代中,您使用它们来读取它们的值(即LHS +=).

在那个时间点,他们的内容(价值)是不确定的.正如您所做的那样,使用它们会调用未定义的行为.

解决方案:始终初始化本地变量,例如

 int lD = 0, rD = 0, sum= 0;
Run Code Online (Sandbox Code Playgroud)