В основном это код C для вызова Oil Well с сайта hackerrank (https://www.hackerrank.com/challenges/oil-well). Я получаю ошибку сегментации или отменю вызов, когда я отправляю этот код (он работает когда-то в моем системном компиляторе).Как отладить ошибку сегментации в C для следующего кода. Я использовал malloc и бесплатно во многих функциях, а также в основном
Может ли кто-нибудь сказать мне, как исправить эту проблему ?. Заранее спасибо.
#include <math.h>
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <assert.h>
#include <limits.h>
#include <stdbool.h>
int *min, c, r, q = 0;
void findmin()
{
int i, minimum = min[0];
for (i = 0; i < q; i++)
{
if (min[i] > minimum)
minimum = min[i];
}
printf("%d", minimum);
}
void calculate(int a[], int r)
{
int sum = 0;
int i;
int *x, *y;
x = (int *) malloc(sizeof(int) * 3);
y = (int *) malloc(sizeof(int) * 3);
for (i = 0; i <= r; i++)
{
x[i] = a[i] % c;
y[i] = a[i]/c;
}
for (i = 1; i <= r; i++)
{
if ((x[i] - x[i - 1]) > (y[i] - y[i - 1]))
sum = sum + (x[i] - x[i - 1]);
else
sum = sum + (y[i] - y[i - 1]);
}
min[q] = sum;
q++;
free(x);
free(y);
}
void swap(int *x, int *y)
{
int temp;
temp = *x;
*x = *y;
*y = temp;
}
void permute(int a[], int l, int r)
{
int i;
if (l == r)
{
for (i = 0; i <= r; i++)
calculate(a, r);
}
else
{
for (i = l; i <= r; i++)
{
swap((a + l), (a + i));
permute(a, l + 1, r);
swap((a + l), (a + i));
}
}
}
int main(void)
{
int i, j, k = 0;
scanf("%d%d", &r, &c);
int *arr;
arr = (int *) malloc(sizeof(int) * r * c);
int **x = (int **) malloc(r * sizeof(int *));
for (i = 0; i < r; i++)
x[i] = (int *) malloc(c * sizeof(int));
for (i = 0; i < r; i++)
for (j = 0; j < c; j++)
scanf("%d", &x[i][j]);
for (i = 0; i < r; i++)
{
for (j = 0; j < c; j++)
{
if (x[i][j] == 1)
{
arr[k] = c * i + j;
k++;
}
}
}
/*printf("Content of arr array is:\n");
for(i=0;i<k;i++)
printf("%d \n",arr[i]);
*/
min = (int *) malloc(sizeof(int) * r * c);
permute(arr, 0, k - 1);
findmin();
free(arr);
free(x);
free(min);
}
Обновленный код (С учетом всех предложений и ответов учитывается)
#include <math.h>
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <assert.h>
#include <limits.h>
#include <stdbool.h>
int *min,c,r,q=0;
void findmin()
{
int i,minimum=min[0];
/*printf("\nmin array is \n");
for(i=0;i<q;i++)
{
printf("%d ",min[i]);
}*/
for(i=0;i<q;i++)
{
if(min[i]<minimum)
minimum=min[i];
}
printf("%d",minimum);
}
void calculate(int a[],int r)
{
int sum=0;
int i;
int *x,*y;
x = (int *)malloc(sizeof(int)*r+1);
y = (int *)malloc(sizeof(int)*r+1);
for(i=0;i<=r;i++)
{
x[i]=a[i]%c;
y[i]=a[i]/c;
}
for(i=1;i<=r;i++)
{
if(abs(x[i]-x[i-1])>abs(y[i]-y[i-1]))
sum=sum+abs(x[i]-x[i-1]);
else
sum=sum+abs(y[i]-y[i-1]);
}
min[q]=sum;
q++;
free(x);
free(y);
//printf("I am here also");
}
void swap(int *x,int *y)
{
int temp;
temp=*x;
*x=*y;
*y=temp;
}
void permute(int a[],int l,int r)
{
int i;
if(l==r)
{
for(i=0;i<=r;i++)
//printf("%d ",a[i]);
calculate(a,r);
//printf("\n");
}
else
{
for(i=l;i<=r;i++)
{
swap((a+l),(a+i));
permute(a,l+1,r);
swap((a+l),(a+i));
}
}
}
int main(){
int i,j,k=0;
scanf("%d%d",&r,&c);
int *arr;
arr = (int *)malloc(sizeof(int)*r*c);
int **x = (int **)malloc(r * sizeof(int *));
for (i=0; i<r; i++)
x[i] = (int *)malloc(c * sizeof(int));
for(i=0;i<r;i++)
for(j=0;j<c;j++)
scanf("%d",&x[i][j]);
/*for(i=0;i<r;i++)
{
for(j=0;j<c;j++)
printf("%d ",x[i][j]);
printf("\n");
}*/
for(i=0;i<r;i++)
{
for(j=0;j<c;j++)
{
if(x[i][j]==1)
{
arr[k]=c*i+j;
k++;
}
}
}
//printf("Content of arr array is:\n");
//for(i=0;i<k;i++)
//printf("%d \n",arr[i]);
//printf("\nCalling permutation\n");
min = (int *)malloc(sizeof(int)*r*c);
permute(arr,0,k-1);
//printf("\nFinding min call\n");
findmin();
free(arr);
for (i = 0; i < r; i++)
{
free(x[i]);
}
free(x);
free(min);
return 0;
}
1) 'min [i]> minimum' ->' min [i]
BLUEPIXY
использовать gdb или аналогичный. –
2) 'x = (int *) malloc (sizeof (int) * 3); y = (int *) malloc (sizeof (int) * 3); ':' 3' -> 'r + 1' – BLUEPIXY