在c

时间:2019-03-15 12:42:16

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

我正在这样的头文件中声明2d数组: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;
    }
}

2 个答案:

答案 0 :(得分:2)

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数组并以零初始化

答案 1 :(得分:1)

由于超出了数组的边界,因此出现了分段错误。

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

应成为:

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

对于另一个也是类似的。不要忘记数组索引比数组的大小(以元素为单位)小0到1。

也:

记分板的内存分配了吗?当前,您要创建一个名为arr的数组,而不是为要初始化的记分板创建一个数组,因此scoreboard[u]可能也超出范围,而与u的值无关。