我的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循环'会弹出错误。
答案 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];
}
的矩阵