【问题标题】:Sum of all elements in a two dimensional array. In C二维数组中所有元素的总和。在 C 中
【发布时间】:2020-09-24 07:45:11
【问题描述】:

我正在尝试制作将数组中所有元素相加的函数,但我一直失败。指针有问题还是其他问题?我将不胜感激。

#include <stdio.h>

int element_sum(int *data)
{
    int  x = 0; //sum of all elements
    for (int i = 0; i < 3; i++) //loop for row
    {
        for (int j = 0; j < 4; j++) //loop for column
        {
            x += &data[i][j];
            printf("%d\n", x);
        }
    }
    return x;
}

int main(void)
{
    int data[3][4] = {{22, 23, 123, 192}, {43, 335, 44, 9}, {3, 93, 8, 7}};
    int sum; // sum 
    sum = element_sum(*data); //function 
    printf("sum = %d\n", sum);
    return 0;
}

【问题讨论】:

    标签: arrays c pointers multidimensional-array


    【解决方案1】:

    由于数组是连续的内存块,您可以对任意数量的维度执行以下操作:

    #include <stdio.h>
    #include <stdlib.h>
    #include <stdarg.h>
    
    int addAll(int *arr, size_t nDim, ...)
    {
        va_list list;
        size_t nElem = 1;
        int result = 0;
    
        va_start(list, nDim);
    
        for(size_t dim = 0; dim < nDim; dim++)
        {
            nElem *= va_arg(list, int);
        }
        printf("Number of elelments %zu\n", nElem);
    
        while(nElem--) result += *arr++;
    
        return result;
    }
    
    int main(void)
    {
        int data[3][4] = {{31, 25, 12, 19}, {3, 35, 4, 46}, {8, 33, 11, 5}};
        int sum; // sum 
        sum = addAll(*data, 2, 3, 4); //function 
        printf("sum = %d\n", sum);
        return 0;
    }
    

    https://godbolt.org/z/nx1139

    或用于 3D

    int main(void)
    {
        int data[][3][4] = {
            {{31, 25, 12, 19}, {3, 35, 4, 46}, {8, 33, 11, 5}},
            {{31, 25, 12, 19}, {3, 35, 4, 46}, {8, 33, 11, 5}},
            {{31, 25, 12, 19}, {3, 35, 4, 46}, {8, 33, 11, 5}},
            {{31, 25, 12, 19}, {3, 35, 4, 46}, {8, 33, 11, 5}},
            {{31, 25, 12, 19}, {3, 35, 4, 46}, {8, 33, 11, 5}},
            };
        int sum; // sum 
        sum = addAll(**data, 3, 5, 3, 4); //function 
        printf("sum = %d\n", sum);
        return 0;
    }
    

    https://godbolt.org/z/fMx8G6

    【讨论】:

    • OP:此代码将在现实世界中工作,但您应该知道在 addAll 中的第 5 位取消引用 arr 是未定义的行为(破坏 one-past address i> 规则):stackoverflow.com/q/25303647/1606345
    • 这些都不是。不能越界访问,也不能通过超出范围的下标进行访问。
    • 是的,先生,这很令人惊讶,但是arr的范围仅在arr[0]arr[4]之间有效,其余元素由于过去的规则不能被尊重,不太可能出现问题,因为 C 不进行范围检查,但它是 UB,无论如何这是对 OP 的观察,我很确定你会否认显而易见的(在接受的回答)。
    【解决方案2】:

    将你的数组参数声明为二维数组:

    int matrix_sum(int rows, int cols, int data[rows][cols]) {
        int  x = 0; 
        for (int i = 0; i < rows; i++) {
            for (int j = 0; j < cols; j++) {
                x += data[i][j];
                printf("%d\n", x);
            }
        }
        return x;
    }
    

    调用很简单:

    sum = matrix_sum(3, 4, data);
    

    请注意,这可能不适用于某些过时的编译器,因为它要求您拥有支持 C99 可变长度数组功能的 C 编译器。

    【讨论】:

      【解决方案3】:

      你不能使用指向int的指针来映射一个二维数组,应该是:

      int matrix_sum(int data[][4], int rows)
      {
          int  x = 0; //sum of all elements
          for (int i = 0; i < rows; i++) //loop for row
          {
              for (int j = 0; j < 4; j++) //loop for column
              {
                  x += data[i][j];
                  printf("%d\n", x);
              }
          }
          return q;
      }
      

      也就是说,你至少需要知道最后一个维度,或者你可以使用一维数组来模拟它:

      enum {rows = 3, cols = 4};
      int arr[rows * cols];
      int row, col, index;
      
      for (row = 0; row < rows; row++)
      {
          for (col = 0; col < cols; col++)
          {
              index = cols * row + col;
              arr[index] = index;
              printf("[%d][%d] = %d\n", row, col, index);
          }
      }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2022-01-25
        • 2021-05-22
        • 2013-05-16
        相关资源
        最近更新 更多