Мой код C сталкивается с ошибкой sigsegv
Я не получаю никакой ошибки на локальном компьютере, но codechef и ideone выдают ошибки во время выполнения, я использую Ubuntu с GCC 6.3, если по какой-либо случайности, если вы знаете, как отследить это, пожалуйста, дайте мне знать, чтобы я мог использовать его для моей дальнейшей работы, вот код
#include<stdio.h>
int main()
{
int n, m, i, x, j;
int a[n], b1, b2, b[n], c[m];
do
{
scanf("%d%d", &n, &m);
} while (!((1 <= n && n <= 100000) && (1 <= m && m <= 100000)));
for (i = 1; i <= n; i++)
{
do
{
scanf("%1d", &a[i]);
} while (!(0 <= a[i] && a[i] <= 9));
}
for (i = 1; i <= m; i++)
{
do
{
scanf("%d", &x);
} while (!(1 <= x && x <= n));
b1 = 0;
b2 = 0;
for (j = 1; j < x; j++)
{
b[j] = a[x] - a[j];
if (b[j] > 0)
b1 = b1 + b[j];
if (b[j] < 0)
b2 = b2 + b[j];
}
c[i] = b1 - b2;
}
for (i = 1; i <= m; i++)
printf("\n%d", c[i]);
return 0;
}
1 ответ
Проблема в том, что вы пытаетесь использовать путешествия во времени, чтобы ваш код работал. В следующем фрагменте кода вы объявляете массивы, используя значения, которые вы прочитали позже, что явно не сработает.
int a[n], b1, b2, b[n], c[m];
do
{
scanf("%d%d", &n, &m);
Вместо этого вы должны объявить их как int *
и динамически выделить достаточно места для них.
int *a, b1, b2, *b, *c;
do
{
scanf("%d%d", &n, &m);
} while (!((1 <= n && n <= 100000) && (1 <= m && m <= 100000)));
a=malloc(sizeof(int)*n);
b=malloc(sizeof(int)*n);
c=malloc(sizeof(int)*m);
Вы должны будете помнить, чтобы освободить память, выделенную позже.
Вы также должны помнить, что массивы в C начинаются с индекса 0, а не 1, поэтому там, где у вас есть циклы, такие как:
for (i = 1; i <= n; i++)
do
{
scanf("%1d", &a[i]);
} while (!(0 <= a[i] && a[i] <= 9));
}
они должны быть
for (i = 0; i < n; i++)
do
{
scanf("%1d", &a[i]);
} while (!(0 <= a[i] && a[i] <= 9));
}
потому что иначе, если i
равно n
это будет за размер a
,