为什么我的代码出现分段错误(核心转储)错误?

时间:2020-05-12 16:49:34

标签: c arrays multidimensional-array

我想初始化一个0x5x5数组作为每个数组索引的内容。但是每当我运行我的代码时,我都会遇到分段错误(核心转储错误)。您能帮我解决我的代码有什么问题吗? 我的代码如下。

#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;
        }
    }
}

4 个答案:

答案 0 :(得分:3)

您有一个包含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 };

请注意,我使用名称而不是在各处使用硬编码数字。这样更具可读性,而且不容易出错。

答案 1 :(得分:2)

对于C语言中的数组,索引从0开始。

当我们声明一个数组a[5]时,显然表明我们正在为5分配某些数据类型的a内存空间,一种访问这些内存地址的方法是使用索引。如前所述,在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;
    }
}

答案 2 :(得分:0)

问题是<=插入了<

它将执行6次循环,并在2d数组的每个a[i][j]中设置0

它将从a[0][0]a[5][5]

但是您给下摆记忆了5个立方体(0,1,2,3,4从0而不是1开始), 并且循环设置了6个cubes(0,1,2,3,4,5)但其中5个不在数组中, 因此您遇到了细分错误。

答案 3 :(得分:-1)

您的错误:

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};

将多维数组初始化为零。

可以找到更多概念in this thread