-1

我的 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 循环”弹出错误。

4

1 回答 1

2

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

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

前:

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++;
        }
    }

需要尺寸temporder*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++;
        }
    }

再次没有设置n的第'个元素,使用odd_tempj<n

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

再次没有设置l的第'个元素,使用even_tempi<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

于 2013-03-28T14:27:25.757 回答