c语言 - 'An Access Violation (Segmentation Fault) raised in your program'是什么意思?



在main()

中调用这个函数之前,我的C程序编译并运行良好
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++;
        }
    }
}

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

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

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

f.ex:

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

将抛出分割错误,因为您访问了不存在的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 'th元素,由于在赋值后增加了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++;
        }
    }

再次说明odd_tempn '元素没有设置,使用j<n

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

再次说明,even_templ 'th元素没有设置,使用i<l

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

在这里发生了与第一个循环相同的错误。这应该变成:

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

现在您还可以删除变量k,因为它是未使用的,如果函数仍然做您想要它做的事情,它应该能够处理顺序为MAX_ORDER的矩阵

相关内容

  • 没有找到相关文章

最新更新