簡體   English   中英

C 數組檢查行和列。 指針問題(取消引用 NULL 指針警告)

[英]C Array check row and column. Issue with pointer(dereferencing NULL-Pointer warning)

我還是編程新手,這個網站請善待我一個不知情的傻瓜。 我目前正在執行一項任務。 我們需要在 C 中做一個Binoxo 拼圖,並在輸入值時根據規則檢查它是否正確。 規則是:

  1. 后面的“x”或“o”不能超過兩個。
  2. 每一行和每一列都需要有相同數量的“x”和“o”。
  3. 所有行和列都是唯一的。

Binoxo 字段是一個array[10][10] ,其中填充了“x”、“o”和“”。 對於第二條規則,我有一個可行的解決方案。 但是,我無法真正弄清楚其他兩個。 我目前越來越習慣於數組,但在這里我想我仍然不太了解它。

這是我對規則 1 的一種處理方式:

//There can't be more than two following 'x' or 'o'
for (i = j = 0; i < 10; i++) {
    for (j = 0; j < 10; j++) {
        if ((puzzle[i][j + 1] == val) && (puzzle[i][j - 1] == val)) x++;
        if ((puzzle[i][j + 1] == val) && (puzzle[i][j + 2] == val)) x++;
        if ((puzzle[i][j - 1] == val) && (puzzle[i][j - 2] == val)) x++;
        if ((puzzle[i + 1][j] == val) && (puzzle[i - 1][j] == val)) x++;
        if ((puzzle[i + 1][j] == val) && (puzzle[i + 2][j] == val)) x++;
        if ((puzzle[i - 1][j] == val) && (puzzle[i - 2][j] == val)) x++;

        if (x > 0)
            return false;
    }
}

這是陣列的圖片,以便更好地理解。

在此處輸入圖像描述

我試圖覆蓋一個點周圍的區域,以確保連續不超過兩個 x 或 o。 Val 通過控制台輸入到另一個 function 中,可以是 x 或 o。 當我嘗試運行它時,它首先正確啟動,然后我嘗試輸入一些內容,但出現錯誤0xC0000005 Access Violation

我讀到當指針出現問題時可能會發生此錯誤。 我注意到我有一個警告C6011取消引用 NULL 指針,這導致我這樣做:

char** board() 
{
    int i, j;
    char** puzzle;
    char arrpuzzle[10][10] = {' ', ' ', 'o', 'x', ' ', ' ', ' ', ' ', ' ', 'o',
                            'x', ' ', ' ', 'x', ' ', ' ', ' ', ' ', ' ', ' ',
                            ' ', ' ', 'o', ' ', ' ', 'x', ' ', ' ', ' ', 'o',
                            ' ', ' ', ' ', ' ', 'o', ' ', ' ', ' ', 'o', ' ',
                            'o', ' ', ' ', 'x', ' ', ' ', ' ', 'x', ' ', ' ',
                            'o', ' ', ' ', ' ', ' ', ' ', ' ', ' ', 'o', ' ',
                            ' ', ' ', ' ', 'x', ' ', 'x', ' ', ' ', ' ', ' ',
                            ' ', 'o', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ',
                            ' ', 'o', ' ', 'o', ' ', 'x', 'x', ' ', ' ', ' ',
                            ' ', ' ', 'x', ' ', ' ', ' ', 'o', ' ', 'x', 'o' };

    puzzle = (char**)malloc(sizeof(char*) * 10);

    for (i = 0; i < 10; i++) {
        puzzle[i] = (char*)malloc(sizeof(char) * 10); // Warning here...
        for (j = 0; j < 10; j++) {
            puzzle[i][j] = arrpuzzle[i][j];           // And here
        }
    }
    return puzzle;
}

我做錯了什么? 問題是由於 malloc 引起的嗎? 我能做些什么來解決這個問題? 有人可以給我一些提示嗎?

在您的規則 1 測試代碼中,將無條件檢查相鄰單元格,即使正在測試的單元格位於邊緣(或角落)。

在 memory 中, puzzle指向的內容如下所示:

...
      puzzle
------[X]------------------------------------------------------
--------\------------------------------------------------------
---------[A][B][C][D][E][F][G][H][I][J]------------------------
----------/--/--| ...                 \------------------------
---------/--/---[][][][][][][][][][]---\-----------------------
--------/--[][][][][][][][][][]---------[][][][][][][][][][]---
-------[][][][][][][][][][]------------------------------------
---------------------------------------------------------------
...

訪問puzzle[i][j+1]時,如果i==2j==3 ,則訪問地址C之后的第 5 個字符( C+4*sizeof(char) )。 但是如果j==9 ,則將訪問未定義的值(“第 11 個”值 - 分配的最后一個字符之后的字符單元格)。 這可能不會導致訪問沖突,因為它可能在進程的 memory 范圍內,但可能會導致微妙且難以發現的錯誤。

但是,當訪問puzzle[i+1][j]並且i==9時,存在不同的問題:地址J之后的地址單元將被視為地址(一個char * ),並被取消引用。

存儲在那里的值可能是:

  • 某個值恰好是進程的 memory 范圍內的地址,從而導致細微錯誤。
  • 0x0,導致 NULL 取消引用。
  • 某些值超出進程的 memory 邊界,導致訪問沖突。

其他邊( [i-1][j-1] )的問題類似。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM