【问题标题】:How to detect overflow in two-dimensional array of C? [closed]如何检测C的二维数组中的溢出? [关闭]
【发布时间】:2016-05-18 16:04:28
【问题描述】:

我有一个这样的二维数组:

[1][0][3]
[0][2][0]
[1][0][0]

我应该分析每个位置,如果它周围有一个“0”,并得到那个位置。在那之后,我必须用另一个数字来完成这个位置。问题是,如何检测我正在分析的位置是否不存在,即是否溢出?我知道 C 没有边界检查,但一定有办法检查那个位置。

【问题讨论】:

  • 您知道数组大小,3x3 所以请检查您的索引是否始终在合法范围内...
  • 使用嵌套循环,但适当限制边界条件。从索引 1 开始并在第 2 行或第 2 行停止。在您的示例中的 3X3 的情况下,只有死点中的 [2] 将成为检查的候选对象。
  • 在声明数组的范围内,可以使用sizeof()获取数组的大小。但是如果你将数组传递给一个函数,它只会传递一个指针。您还需要传递大小信息,函数无法自行获取它。

标签: c arrays matrix


【解决方案1】:

您需要使用 GNU Scientific Libraгy 或使用 get/set 函数实现 2dimm 数组。像这样的:

    #include <stdio.h>
    #include <assert.h>
    #include<stdlib.h>

    struct Arr {
        double* arr;
        int max_x;
        int max_y;
    } typedef Arr;

    Arr* Arr_new(int x, int y){
        Arr* result = (Arr*)malloc(sizeof(Arr));
        if (result){
            result->arr = (double*)malloc(x*y*sizeof(double));
            result->max_x = x;
            result->max_y = y;
        }
        return result;
    }

    void Arr_free(Arr* arr){
        free(arr->arr);
        free(arr);
    }

    // Arr_set(arr, 0, 0, 3.14) is correct.
    void Arr_set(Arr* arr, int i, int j, double val){
        //replace your code if needed:
        assert(arr->max_x > i);
        assert(arr->max_y > j);
        arr->arr[i + j*arr->max_x] = val;
    }

    // Arr_get(arr, 0, 0) is correct.
    double Arr_get(Arr* arr, int i, int j){
        //replace your code if needed:
        assert(arr->max_x > i);
        assert(arr->max_y > j);
        return arr->arr[ i + j*arr->max_x];
    }


    int main(void)
    {
        Arr* a = Arr_new(3,3);
        Arr_set(a, 2, 2, 1.234) ;
        double val = Arr_get(a,2,2);
        printf("val = %f\n",val);

        Arr_free(a);
        return 0;
    }

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-05-03
    • 1970-01-01
    • 2018-01-20
    • 2017-03-22
    • 1970-01-01
    相关资源
    最近更新 更多