“程序中出现的访问冲突(分段错误)”是什么意思?

时间:2013-03-28 12:01:54

标签: c multidimensional-array matrix int

我的C程序编译并正常工作,直到我从main()

调用此函数
void rearrangeMainDiagonal(int mat[MAX_ORDER][MAX_ORDER], int order)
{
    int i, j, k=0, l=0, n=0;
    int temp[20], odd_temp[20], even_temp[20];

    for(i=0;i<order;i++) 
    {
        for(j=0;j<order;j++)
        {
            temp[k] = mat[i][i];
            k++;
        }
    }

    for(i=0;i<=k;i++)
    {
        if(temp[i]%2==0)
        {
            even_temp[l] = temp[i];
            l++;
        }
        else
        {
            odd_temp[n] = temp[i];
            n++;
        }
    }

    for(j=0;j<=n;j++)
    {
        temp[j] = odd_temp[j];
    }

    for(i=0;i<=l;i++,j++)
    {
        temp[j] = even_temp[i];
    }

    k=0;
    for(i=0;i<order;i++)
    {
        for(j=0;j<order;j++)
        {
            mat[i][i] = temp[k] ;
            k++;
        }
    }
}

当我运行该程序时,会弹出一条消息,说“程序已停止工作。请关闭程序。当我尝试逐步执行它时,它会显示“程序中出现的访问冲突”并停止。包含'temp [j] = odd_temp [j];'的'for循环'会弹出错误。

1 个答案:

答案 0 :(得分:2)

当程序试图访问未分配给该程序的内存时,会发生分段错误。

分段错误(解除引用NULL指针除外)的最常见原因是访问超出其边界的数组。

f.ex:

int arr[5];
for (int i=0; i<=5; i++)
    arr[i]=i;

会抛出一个Segmentation错误,因为你访问了不存在的arr的第5个元素(因此你试图访问它后面没有分配给你的内存。

您的计划中有多个地方可能会发生这种情况。

void rearrangeMainDiagonal(int mat[MAX_ORDER][MAX_ORDER], int order)
{
    int i, j, k=0, l=0, n=0;

您创建了固定大小的数组,但在使用它们时从不检查索引。 如果我所有其他调整都是正确的,最好使用:

    int temp[MAX_ORDER], odd_temp[MAX_ORDER], even_temp[MAX_ORDER];

并强制命令低于或等于MAX_ORDER:

    assert(order <= MAX_ORDER);

基于函数名称我怀疑这个

    for(i=0;i<order;i++) 
    {
        for(j=0;j<order;j++)
        {
            temp[k] = mat[i][i];
            k++;
        }
    }

要求temp的大小为order*order;

应该更像

    for(i=0;i<order;i++) 
    {
        temp[i] = mat[i][i];
    }

因此,在temp数组中将每个元素放在主对角线上一次,该数组现在应该只有order

这里你循环遍历temp,直到k'元素,你没有在上面的循环版本中设置,因为你在赋值后增加了k 所以你应该循环到k-1,所以使用i<k而不是i<=k;

    for(i=0;i<=k;i++)

应该成为(在上面的循环中改变之后);

    for(i=0;i<order;i++)
    {
        if(temp[i]%2==0)
        {
            even_temp[l] = temp[i];
            l++;
        }
        else
        {
            odd_temp[n] = temp[i];
            n++;
        }
    }

再次设置n的{​​{1}}'元素,使用odd_temp

j<n

再次设置 for(j=0;j<n;j++) { temp[j] = odd_temp[j]; } 的{​​{1}}'元素,使用l

even_temp

这里出现了与第一个循环相同的错误。 这应该成为:

i<l

现在您也可以删除变量k,因为它未被使用,如果函数仍然按照您的意愿执行,它应该能够处理订单最多为 for(i=0;i<l;i++,j++) { temp[j] = even_temp[i]; } 的矩阵