在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_temp
的n
'元素没有设置,使用j<n
for(j=0;j<n;j++)
{
temp[j] = odd_temp[j];
}
再次说明,even_temp
的l
'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
的矩阵