簡體   English   中英

填充數組會導致數組周圍的堆棧損壞

[英]Filling an array causes the stack around the array to be corrupted

我正在嘗試使用for循環內的for循環用0-25之間的隨機數填充4x6數組。 生成數組后發生運行時錯誤-“圍繞變量“ grid”的堆棧已損壞。這是什么引起的?

int grid[4][6];
for (int y = 0; y < 4; y++) { 

    for (int x = 0; x < 6; x++) {
        grid[x][y] = (rand() % 25); 


    }

}

您寫得越界越好。 您的循環可以例如在數組的邊界之外的(5,3)處編寫。 為了解決此問題,請將x用於外部循環,將y用於內部循環。

我認為您的索引向后,在x處應為y,反之亦然

正如其他人所說,您已經將行和列索引向后了。 這是一個問題的原因是在C和C ++中,二維數組訪問:

grid[x][y]

被視為等效的指針表達式:

*(grid + (x*COLS + y))

在這種情況下,由於C和C ++使用行優先順序,因此COLS為6。此外,2D數組等效於大小為1D的數組(ROWS * COLS),這意味着在這種情況下,您可以有效地尋址元素0到23一維數組

現在,查看循環結構,可以看到給定指針算術規則,當x為4且y為0時,將訪問元素24(從而破壞堆棧),即*(grid + 4 * 6 + 0),或您的內部循環的第4次迭代。

切換循環順序(0 <= x <4和0 <= y <6),您的問題將消失。

int grid[6][4];

您可以使用gdbvalgrind或其他任何方法來找出分段錯誤的原因。

暫無
暫無

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

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