我的 C 代码遇到 sigsegv 错误
My C Code is encountering sigsegv error
我在本地机器上没有收到任何错误,但 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;
}
问题是您正试图使用时间旅行来使您的代码工作。在下面的代码片段中,您使用稍后阅读的值声明了数组,这显然是行不通的。
int a[n], b1, b2, b[n], c[m];
do
{
scanf("%d%d", &n, &m);
相反,您应该将它们声明为 int *
并为它们动态分配足够的 space。
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
的大小。
我在本地机器上没有收到任何错误,但 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;
}
问题是您正试图使用时间旅行来使您的代码工作。在下面的代码片段中,您使用稍后阅读的值声明了数组,这显然是行不通的。
int a[n], b1, b2, b[n], c[m];
do
{
scanf("%d%d", &n, &m);
相反,您应该将它们声明为 int *
并为它们动态分配足够的 space。
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
的大小。