简单C代码中的分段错误(核心转储)是由于变量取值范围较大



我编写了以下代码来查找由3位数乘积形成的最大回文。嵌套循环存在一个问题,它会导致分段错误。有人能帮我调试吗?

该代码适用于较小的数字,但适用于较大的数字时会出现分段错误(这就是我对k、l、max和a变量使用long int而不是int的原因)。

#include<stdio.h>
long reverse(long);
main()
{
long k, l, max, a[100];
int i, j, t=0;
printf("hellon");
for(i=999; i>99; i--)
{
    for(j=999; j>99;j--)
    {
    //  printf("hellon");          
        k=i*j;
        l= reverse(k);
        if(k==l) {a[t]=k; t++; }
    }
}
printf("hellon");
max=a[0];
for(t=1;t<100; t++)
{
    if(max<a[t]) {max=a[t];}
}
printf("Largest palindrome is %ldn", max);
}

long reverse(long n)
{
long rev=0;
while(n!=0)
{
    rev= rev*10;
    rev= rev+n%10;
    n=n/10; 
}
return rev;
}

对于较大的数字,t的大小会超过数组a的大小。

这将导致程序在不应该写入的程序堆栈上写入,这可能会导致核心转储崩溃。

如果你只想找到最大的回文,你不需要把它们都保存下来。你可以保存最大的一个。

由于a只有100个元素长,因此需要确保t始终小于100,否则将溢出数组的边界。您可能希望使用realloc来使用指针动态分配a

相关内容

  • 没有找到相关文章

最新更新