【问题标题】:My C Code is encountering sigsegv error [duplicate]我的 C 代码遇到 sigsegv 错误 [重复]
【发布时间】:2017-09-29 11:53:51
【问题描述】:

我在本地机器上没有收到任何错误,但 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]; : nm 未初始化。
  • for(i=1;i&lt;=n;i++) --> for(i=0;i&lt;n;i++)
  • 尝试调试段错误时,在 GDB 中运行并获取段错误发生位置的回溯并查看相关变量非常有用。

标签: c runtime segmentation-fault gcc6


【解决方案1】:

问题是您正在尝试使用时间旅行来使您的代码正常工作。在下面的 sn-p 代码中,您使用稍后读取的值声明数组,这显然行不通。

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 的大小。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-10-27
    相关资源
    最近更新 更多