gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-30 20:15:52 30 4
gpt4 key购买 nike

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

最佳答案

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

段错误的最常见原因(除了取消引用 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尺寸

在这里你循环温度直到 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_temp 的第 ' 个元素未设置,使用j<n

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

再次l even_temp 的第 ' 个元素未设置,使用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 的矩阵。

关于c - 'An Access Violation (Segmentation Fault) raised in your program'是什么意思?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15681269/

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com