【问题标题】:Segmentation fault when initializing 2D array in c [closed]在c中初始化二维数组时出现分段错误[关闭]
【发布时间】:2019-03-15 12:42:15
【问题描述】:

我在头文件中声明一个二维数组,如下所示:int **arr; 然后我分配内存并用零初始化它。 但是我遇到了分段错误。

这是我的代码:

arr = (int **)malloc(d * sizeof(int *)); 
for (int u=0; u<d; u++) 
    arr[u] = (int *)malloc(q * sizeof(int)); 
for(int i=0; i<d+1; i++)
{
    for(int j=0; j<q+1; j++)
    {
        arr[i][j]=0;
    }
}

【问题讨论】:

  • j&lt;q+1 没有。检查你的界限。
  • arr的目的是什么?
  • 你混淆了scoreBoardarr吗? scoreboard 是什么?

标签: c arrays pointers segmentation-fault double-pointer


【解决方案1】:

d+1 和 q+1 都在边界之外。 使用 d 和 q

如果你想用零初始化,请使用 calloc(),它使用简单,减少了冗余操作

arr = (int **)malloc(d * sizeof(int *)); 
for (int u=0; u<d; u++) 
    scoreBoard[u] = (int *)calloc(q , sizeof(int)); 

此代码将创建 2d int 数组并用零初始化

【讨论】:

    【解决方案2】:

    您遇到了分段错误,因为您超出了数组的界限。

    for (int i = 0; i < d + 1; i++)
    

    应该变成:

    for (int i = 0; i < d; i++)
    

    另外一个也是如此。不要忘记数组索引从 0 到 1 小于数组的大小(以元素为单位)。

    还有:

    记分牌的内存分配了吗?目前,您创建了一个名为 arr 的数组,而不是用于您正在初始化的记分牌,因此无论 u 的值如何,scoreboard[u] 也可能超出范围。

    【讨论】:

    • scoreBoard[u] 也可能超出界限
    猜你喜欢
    • 2013-10-04
    • 1970-01-01
    • 2021-12-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-12-28
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多