我還是編程新手,這個網站請善待我一個不知情的傻瓜。我目前正在執行一項任務。我們需要用 C 語言制作一個Binoxo 拼圖,并在輸入值時根據規則檢查它是否正確。規則是:
- 后面的“x”或“o”不能超過兩個。
- 每一行和每一列都需要有相同數量的“x”和“o”。
- 所有行和列都是唯一的。
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 通過控制臺輸入到另一個函式中,可以是 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嗎?我能做些什么來解決這個問題?有人可以給我一些提示嗎?
uj5u.com熱心網友回復:
在您的規則 1 測驗代碼中,將無條件檢查相鄰單元格,即使正在測驗的單元格位于邊緣(或角落)。
在記憶體中,puzzle指向的內容如下所示:
...
puzzle
------[X]------------------------------------------------------
--------\------------------------------------------------------
---------[A][B][C][D][E][F][G][H][I][J]------------------------
----------/--/--| ... \------------------------
---------/--/---[][][][][][][][][][]---\-----------------------
--------/--[][][][][][][][][][]---------[][][][][][][][][][]---
-------[][][][][][][][][][]------------------------------------
---------------------------------------------------------------
...
訪問時puzzle[i][j 1],如果i==2和j==3,則訪問地址后的第 5 個字符C( C 4*sizeof(char))。但是如果j==9,則將訪問一個未定義的值(“第 11 個”值 - 分配的最后一個字符之后的字符單元格)。這可能不會導致訪問沖突,因為它可能在行程的記憶體范圍內,但可能會導致微妙且難以發現的錯誤。
但是,當puzzle[i 1][j]訪問 和i==9時,存在不同的問題:地址之后的地址單元J將被視為地址 (a char *),并被取消參考。
存盤在那里的值可能是:
- 某個值恰好是行程記憶體范圍內的地址,從而導致細微錯誤。
- 0x0,導致 NULL 取消參考。
- 某些值超出行程的記憶體邊界,導致訪問沖突。
[i-1]其他邊(和[j-1])的問題類似。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/417156.html
標籤:
上一篇:__declspec(dllimport)extern"C"和extern"C"__declspec(dllimport)有什么區別
下一篇:如何在scanf中只輸入一個?
