[英]C Array check row and column. Issue with pointer(dereferencing NULL-Pointer warning)
我還是編程新手,這個網站請善待我一個不知情的傻瓜。 我目前正在執行一項任務。 我們需要在 C 中做一個Binoxo 拼圖,並在輸入值時根據規則檢查它是否正確。 規則是:
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==2
和j==3
,則訪問地址C
之后的第 5 個字符( C+4*sizeof(char)
)。 但是如果j==9
,則將訪問未定義的值(“第 11 個”值 - 分配的最后一個字符之后的字符單元格)。 這可能不會導致訪問沖突,因為它可能在進程的 memory 范圍內,但可能會導致微妙且難以發現的錯誤。
但是,當訪問puzzle[i+1][j]
並且i==9
時,存在不同的問題:地址J
之后的地址單元將被視為地址(一個char *
),並被取消引用。
存儲在那里的值可能是:
其他邊( [i-1]
和[j-1]
)的問題類似。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.