簡體   English   中英

為什么我的代碼給出分段錯誤(核心轉儲)錯誤?

[英]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.

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