gpt4 book ai didi

c - 无法解决此错误 "Access violation"

转载 作者:行者123 更新时间:2023-11-30 19:44:46 28 4
gpt4 key购买 nike

我正在尝试使用埃拉托斯特尼筛法解决 SPOJ 的 PRIME1 问题。该代码对于较小的整数工作正常,但对于长整数显示以下错误 -

"Unhandled exception at 0x770d15ee in spoj1.exe: 0xC0000005: Access violation writing location 0x0014010c."

请帮我解决一下。另外,我是编码新手,所以请容忍我犯的任何错误。

这是我的代码 -

#include <stdio.h>
#include <stdlib.h>

int main()
{
int m, n, test, i, k;
long int *arr, p;

scanf("%d", &test);

while (test--)
{
scanf("%d%d", &m, &n);

arr = (long int *)calloc(n - 1, sizeof(long int));

if (m == 1)
{
m = 2;
}
arr[0] = 2;

for (i = 1; i < n - 1; i++)
{
arr[i] = arr[i - 1] + 1;
// printf("%d\n",arr[i]);
}

for (i = 0; i < n - 1; i++)
{
if (arr[i] != 0)
{
for (k = arr[i] - 2; k < n - 1; )
{
k = k + arr[i];
arr[k] = 0;
}
}
}

for (i = 0; i < n - 1; i++)
{
if (arr[i] != 0 && arr[i] >= m)
{
printf("%d\n", arr[i]);
}
}

printf("\n");
}

free(arr);
return 0;
}

编辑

是的。 k = k + arr[i] 正在创建错误。谢谢。但对于大数字我仍然收到错误。示例 - 代码对于 m = 100000000n = 110000000 运行良好,但对于 m = 999899999n = 999999999 显示以下错误。错误是 - “spoj1.exe 中 0x778a15ee 处出现未处理的异常:0xC0000005:写入位置 0x00000000 时出现访问冲突。”修改后的代码是-

for(k = arr[i]-2; k<n-1;)
{
k = k + arr[i];
if(k < n-1)
{
arr[k] = 0;
}

最佳答案

在此代码块中:

for (i = 0; i < n - 1; i++)
{
if (arr[i] != 0)
{
for (k = arr[i] - 2; k < n - 1; )
{
k = k + arr[i];
arr[k] = 0; // <-- this line can/will access an element of arr[]
// that is beyond the bounds of the arr[] array
// remembering that arr[] only contains n-1 elements
// therefore the max offset is m-2
// so, when 'k' gets to be >= n-1
// then arr[k] is accessing an element
// beyond the end of arr[]
}
}
}

内部for循环可以超出arr[]的范围。当 k 大于 n-2

时会发生这种情况

关于c - 无法解决此错误 "Access violation",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27372268/

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