我正在解决一个问题 https://www.codechef.com/problems/DCGAME/ 在这里面,我找不到运行时错误(SIGSEGV)背后的原因。在我的电脑上,输出很好。我知道这个错误的含义,但仍然无法找到我犯错误的地方。我的代码如下:
#include <stdio.h>
void calc(long long int arr1[],int n,long long int arr2[][n],long long int game[],int m)
{
//printf("Pre process %d %d",n,m);
int i,j;
for(i=0;i<n;i++){game[arr1[i]]++;}
for(i=1;i<n;i++)
{
for(j=0;j<=n-i-1;j++)
{
if(arr2[i-1][j]>arr1[i+j])
arr2[i][j]=arr2[i-1][j];
else
arr2[i][j]=arr1[i+j];
game[arr2[i][j]]++;
}
}
//for(i=0;i<=m;i++){printf(" %d ",game[i]);}
}
int main(){
int n,m,i,count=0,k;
char c,p;
scanf("%d %d",&n,&m);
long long int a[n],b[n][n],max=0;
for(i=0;i<n;i++)
{
scanf("%lld",&a[i]);
if(a[i]>max)max=a[i];
b[0][i]=a[i];
}
long long int game[max+1];
for(i=0;i<=max;i++)
game[i]=0;
calc(a,n,b,game,max);
while(m--)
{
// printf("WHILE-M");
c=getchar();
//scanf("%c",&c);
scanf("%c %d %c",&c,&k,&p);
switch(c)
{//printf("SWITCH");
case '<':
//printf("CASE <");
if(k>max){if(p=='D')
{
printf("C");count=0;
}
else
{
printf("D");count=0;
}break;}
for(i=1;i<k;i++)
{if(game[i]>0)
count+=game[i];
}
if(count%2==0)
{
if(p=='D')
{
printf("C");count=0;
}
else
{
printf("D");count=0;
}
}
else
{
if(p=='D')
{
printf("D");count=0;
}
else
{
printf("C");count=0;
}
}
break;
case '>':
//printf("CASE >");
if(k>max){if(p=='D')
{
printf("C");count=0;
}
else
{
printf("D");count=0;
}break;}
for(i=k+1;i<=max;i++)
{if(game[i]>0)
count+=game[i];
}
if(count%2==0)
{
if(p=='D')
{
printf("C");count=0;
}
else
{
printf("D");count=0;
}
}
else
{
if(p=='D')
{
printf("D");count=0;
}
else
{
printf("C");count=0;
}
}
break;
case '=':
//printf("CASE =");
if(k>max){if(p=='D')
{
printf("C");count=0;
}
else
{
printf("D");count=0;
}break;}
count+=game[k];
if(count%2==0)
{
if(p=='D')
{
printf("C");count=0;
}
else
{
printf("D");count=0;
}
}
else
{
if(p=='D')
{
printf("D");count=0;
}
else
{
printf("C");count=0;
}
}
break;
}
}
return 0;
}
最佳答案
如果您的算法在其他方面是正确的(我没有检查)但是您的堆栈空间用完了,那么一个简短的解决方法是更改 long long int a[n],b[n][n],max=0;
到:
long long int *a, (*b)[n], max = 0;
a = malloc(n * sizeof *a);
b = malloc(n * sizeof *b);
同时更改long long int game[max+1]; for(i=0;i<=max;i++) game[i]=0;
到:
long long int *game = calloc(max+1, sizeof *game);
你还应该检查失败,例如if ( !a || !b ) exit(EXIT_FAILURE);
.其余代码可以保持不变。
关于c - codechef 中的运行时错误 (SIGSEGV),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32051098/