[英]Why my code give segmentation fault(core dumped) error?
我想用 0 初始化一個 5x5 數組作為每個數組索引的內容。 但是每當我運行我的代碼時,我都會遇到分段錯誤(核心轉儲錯誤)。 你能幫我看看我的代碼有什么問題嗎? 我的代碼如下。
#include <stdio.h>
int main()
{
int a[5][5];
int i,j;
for(i=0; i<=5; i++)
{
for(j=0; j<=5; j++)
{
a[i][j]=0;
}
}
}
您有一個包含 5 行(索引 0..4)和 5 個列(索引 0..4)的數組,但您正在訪問 6 行(索引 0..5)和 6 個列(索引 0..5)。 您需要調整循環的邊界。
#define ROWS 5
#define COLS 5
int a[ROWS][COLS];
for (int i=0; i<ROWS; ++i) {
for (int j=0; j<COLS; ++j) {
a[i][j] = 0;
}
}
也就是說,您可以簡單地使用以下內容來初始化數組:
#define ROWS 5
#define COLS 5
int a[ROWS][COLS] = { 0 };
請注意,我使用了名稱,而不是在任何地方對數字進行硬編碼。 這更具可讀性並且更不容易出錯。
對於 C 中的 arrays,索引從 0 開始。
當我們聲明一個數組a[5]
時,這顯然表明我們正在為a
分配一些數據類型的5
memory 空間,訪問這些 memory 地址的一種方法是使用索引。 正如我之前所說,在 C 中,索引從 0 開始,這 5 個空格將是:
1 2 3 4 5 <--------- Actual position
a[0] a[1] a[2] a[3] a[4] <--------- Array index
因此,當我們嘗試訪問上述示例a[5]
時,將導致分段錯誤。
同樣,對於您的情況,您應該更正您的 for 循環,如下所示:
for (i = 0; i < 5; i++) {
for (j = 0; j < 5; j++) {
a[i][j] = 0;
}
}
問題是<=
insted of <
它將循環 6 次,並在 2d 數組中的每個a[i][j]
中設置 0
它將從a[0][0]
開始到a[5][5]
但是你給了下擺一個 memory 5 個立方體(0,1,2,3,4 它從 0 開始,而不是 1),並且循環設置 6 個立方體(0,1,2,3,4,5)但 5 是不在數組中,所以你有一個分段錯誤。
你的錯誤:
for(i=0; i<=5; i++) // accessed extra element where there are only 5 (i < 5)
for(j=0; j<=5; j++) // same with this, correct: (j < 5)
a[i][j]=0;
正確的解決方案是:
for(i = 0; i < 5; i++)
for(j = 0; j < 5; j++)
a[i][j]=0;
利用:
int a[5][5] = {0};
將多維 arrays 初始化為零。
更多概念可以在這個線程中找到。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.