2016-05-18 49 views
0

我有一個二維數組是這樣的:如何檢測C的二維數組溢出?

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

我應該分析每個位置,如果它周圍有一個「0」,並得到那個職位。在那之後,我必須用另一個數字來完成這個職位。問題是,如何檢測我分析的位置是否不存在,即是否過度?我知道C沒有邊界檢查,但是必須有辦法檢查那個位置。

+1

你知道數組的大小,'3x3'所以請你索引始終在法律範圍內... – StoryTeller

+0

使用嵌套循環,但適當地限制你的邊界條件。從索引1開始,並在第2行或第2行停止。在您的示例中,3X3的情況下,只有死點中的[2]將成爲檢查的候選對象。 – nicomp

+0

在聲明數組的範圍內,可以使用'sizeof()'來獲取數組的大小。但是如果你將數組傳遞給一個函數,它只是傳遞一個指針。您還需要傳遞尺寸信息,函數無法自行獲取。 – Barmar

回答

0

您需要使用GNU Scientific Libragi或使用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; 
    }