【问题标题】:Why my code give segmentation fault(core dumped) error?为什么我的代码给出分段错误(核心转储)错误?
【发布时间】:2020-05-12 16:49:34
【问题描述】:

我想用 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)。顺便说一句,您可以使用int a[5][5] = { 0 }; 初始化数组。
  • 一个 a[5] 数组的索引从 0 到 4。您的循环在 i&lt;=5 处停止,因此您尝试获取 a[5] -> 越界。使用i&lt;5 停止循环。同上j
  • 你有越界访问:索引范围是从 0 到 4。所以修复条件:&lt;=5 -> &lt;5。顺便说一句,为了将整个数组初始化为零,您可以改为:int a[5][5] = {0};.

标签: c arrays multidimensional-array


【解决方案1】:

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

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

【讨论】:

    【解决方案2】:

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

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

    【讨论】:

      【解决方案3】:

      问题是&lt;= insted of &lt;

      它将循环6次,并在二维数组中的每个a[i][j]中设置0

      它将从a[0][0] 开始到a[5][5]

      但是你给了 hem 5 个立方体的记忆(0,1,2,3,4 它从 0 开始,而不是 1), 并且循环设置了 6 个立方体(0,1,2,3,4,5),但 5 不在数组中, 所以你有一个分段错误。

      【讨论】:

        【解决方案4】:

        你的错误:

        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

        【讨论】:

        • @ikegami 解释已添加。
        • 最好只在答案中发布工作代码,而不是错误。
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-09-04
        • 2022-10-13
        • 2017-01-26
        • 2015-11-24
        相关资源
        最近更新 更多