C - 出现 SIGABRT 错误,对我来说没有任何意义

C - Getting a SIGABRT error, does not make any sense for me

所以,我的程序应该读取格式为 {1,2,3,4,5} 的未知大小的正整数数组,将其处理成数组,然后开始读取整数对 a 和 b并找到该数组的 a 到 (b-1)th 元素的最小公倍数。 这是我目前的解决方案:

#include <stdio.h>
#include <stdlib.h>

int gcf(int a, int b) // greatest common divisor
{
    while (a*b!=0)
    {
        if (a<b)
            b=b-a;
        else
            if (b<a)
                a=a-b;
        else
            if (a==b)
                return a;
    }
    return 0;
}

int lcm(int a, int b) // least common multiplier
{
    return a*b/gcf(a,b);
}

int main()
{
    int a,bufUsed=0,bufCurr=0,i,b,signal=1,curlcm;
    char c;
    int* tmp;
    int* array;
    c=getchar();
    if (c!='{')
    {
        printf ("err0");
        return 0;
    }
    while((scanf("%d",&a))==1)
    {
        if (signal==0) // checking for the comma
        {
            printf("err1");
            return 0;
        }
        signal=0;
        printf("%d ",a); // displaying current values, used just for debugging
        if (bufUsed == bufCurr) //resizing the current array 
        {
           bufCurr += 20;
           tmp = (int*)realloc(array, bufCurr); // the line that causes trouble
           if (!tmp)
               printf("err2");
           array = tmp;
        }
        array[bufUsed] = a;
        bufUsed++;
        if (scanf(" %c",&c)==1) // checking for commas or closing bracket
        {
            if (c==',')
            {
                signal=1;
                continue;
            }
            if (c=='}')
                break;
            else
            {
                printf("err3");
                return 0;
            }
        }
        else
        {
            printf("err4");
            return 0;
        }
    }
    while ((scanf("%d %d",&a,&b))==2) // the second part, finding the LCM
    {
        curlcm=lcm(array[a],array[a+1]);
        for (i=2;i<b-a;i++)
        {
            curlcm=lcm(curlcm,array[a+i]);
        }
        printf("%d\n",curlcm);
    }
    return 0;
}

tmp = (int*)realloc(array, bufCurr);

似乎是导致 SIGABRT 的原因,根据 gdb,但是,如果我删除程序的第二部分(找到 LCM while 循环),它工作得很好。我已经尝试检查第二部分如何与第二个程序中定义的数组一起使用:

int main()
{
    int a,i,b,curlcm;
    int array[10];
    for (i=0;i<10;i++)
        array[i]=i+1;      
    scanf("%d %d",&a,&b);
    curlcm=lcm(array[a],array[a+1]);
    for (i=2;i<b-a;i++)
    {
        curlcm=lcm(curlcm,array[a+i]);
    }
    printf("%d",curlcm);
}

而且它运行起来也很好。

那么为什么将这两者结合起来会导致 SIGABRT?我试过检查访问数组是否会导致问题,但是,情况似乎并非如此。提前感谢您的任何建议。

根据手册,函数

void *realloc(void *ptr, size_t size);

The realloc() function changes the size of the memory block pointed to by ptr to size bytes. The contents will be unchanged in the range from the start of the region up to the minimum of the old and new sizes. If the new size is larger than the old size, the added memory will not be initialized. If ptr is NULL, then the call is equivalent to malloc(size)

在程序中,我们有

int* array;
...
tmp = (int*)realloc(array, bufCurr);

第一次调用reallocarray指针未初始化

内存管理器尝试根据该随机地址读取一些内部数据(例如段的大小与请求的大小),这会导致未定义的行为(在您的情况下崩溃)。

如建议的那样,一个简单的解决方案包括最初将 array 设置为 NULL,以便 realloc 执行简单的 malloc(因为其 ptr地址是 NULL).

int *array = NULL;