【问题标题】:Two-dimensional array full of garbage data... sometimes充满垃圾数据的二维数组......有时
【发布时间】:2016-01-18 08:08:18
【问题描述】:

我一直在 HackerRank 处理 this 简单编码挑战。我决定将我的解决方案实现为 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() 函数(提供了输入矩阵的代码):

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;
}

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

【问题讨论】:

    标签: c arrays pointers initialization


    【解决方案1】:

    在您的代码中,您已经定义了

     int lD, rD, sum;
    

    没有初始化然后,你写了

     rD += arr[i][j];
    

    lD += arr[i][j];
    

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

    在那个时间点,它们的内容(值)是不确定的。正如你所做的那样,使用它们会调用undefined behavior

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

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

    【讨论】:

    • 一个愚蠢的错误,哦,好吧。我只是假设我在将矩阵传递给我的函数时犯了一个错误,并被划分为寻找那个。我很想知道为什么 printf 调用使它起作用。有趣的是,我试过了,它在本地与 gcc 一起工作,但不适用于hackerrank 使用的任何编译器。
    【解决方案2】:

    您正在尝试使用非常量值 (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 函数读入内存。代码编译正确,但有时会给出随机垃圾数据,第一个答案解决了问题。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-12-31
    • 2022-11-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-08-08
    • 1970-01-01
    相关资源
    最近更新 更多