我的C代码中SIGABRT错误的原因是什么?如何克服?

我的C代码中SIGABRT错误的原因是什么?如何克服?,c,memory-management,out-of-memory,sigabrt,C,Memory Management,Out Of Memory,Sigabrt,只有当我尝试输入大数据时,才会发生错误。在阅读了大量的参考资料后,我发现这个错误的原因如下- 1.不允许触摸内存位置。 2.在内存上使用free()时,我们没有保留或双击free()指针。 3.初始化无效索引(例如创建具有负索引的数组) 我在代码中找到了一个可能导致此错误的原因- 链接- 上面说- “可能是n的限制太大了!你不能为在线评委制作10^8大小的数组。 在堆内存中,也就是在主函数之外。在主函数中创建大小为10^7的数组可能会导致运行时错误。 尽量不要为数组使用超过10^8个顺序的元素:

只有当我尝试输入大数据时,才会发生错误。在阅读了大量的参考资料后,我发现这个错误的原因如下- 1.不允许触摸内存位置。 2.在内存上使用free()时,我们没有保留或双击free()指针。 3.初始化无效索引(例如创建具有负索引的数组) 我在代码中找到了一个可能导致此错误的原因-

链接-

上面说- “可能是n的限制太大了!你不能为在线评委制作10^8大小的数组。 在堆内存中,也就是在主函数之外。在主函数中创建大小为10^7的数组可能会导致运行时错误。 尽量不要为数组使用超过10^8个顺序的元素:)

在你尝试的问题中,上限是10^9 您可以创建该大小的数组。这就是SIGABRT错误的原因,这意味着您超出了内存限制。”

然后我将声明和输入部分修改为-

int main(void)
{
    int test_cases;
    scanf("%i",&test_cases);

    for (int i=0; i<test_cases; i++)
    {
        findresult(i);
    }

void findresult(int i)
{
        int relations; // of the size 10^6
        scanf("%i",&relations);

        int* pair1 = malloc(sizeof(int)*relations);
        int* pair2 = malloc(sizeof(int)*relations);
        for (int j=0; j<relations; j++)
        {
            scanf("%i %i",&pair1[j],&pair2[j]);
        }
int main(无效)
{
int测试用例;
scanf(“%i”和测试用例);

对于(int i=0;i首先,您确实应该检查
malloc
的返回值,尤其是在分配大量内存时

如果它不能分配内存,它将返回
NULL
,如果您尝试取消引用,它将给您未定义的行为

如果是这种情况,您将需要找到一种不耗尽内存的存储数据的方法,例如使用文件来存储数据,并且一次只加载文件的部分

您还应该检查
scanf
的返回值,以确保它实际上正在扫描两个项目,以免
friends
和/或
relations
被设置为任意值


另一件需要注意的事情是,实际上您正在释放
findresult
中分配的内存。您没有向我们展示整个函数,但是如果在返回
main
中的循环之前未能释放内存,将导致数百万字节的内存泄漏(例如,假设您的
int
类型的长度为四个字节,每次循环大约8MB)。这可能会很快耗尽您的内存,具体取决于您为
测试用例输入的值

链接中的代码写入
开始[n]
(超出缓冲区的范围)
n
次,而不是填充。而且你发布的代码不是一个。是的,你对代码的看法是正确的,但我提供该链接的目的是显示信息来源是一个体面论坛的高层贡献者。我已经对我发布的代码进行了一些解释,以澄清我的问题。我回头看mcve问题。停止描述你的问题代码。用尽可能小的例子来展示它。很抱歉,我认为我之前提供的代码不够充分或不清楚。我尽我所能更正了这一点。谢谢。你看,你提供的代码没有编译。现在它确实足够简单,可以修复。但是如果你没有提供可编译的exa例如,这里的任何人怎么知道您没有遗漏与您面临的问题相关的任何其他内容?此外,如果这是一个运行时问题,您需要提供可以演示它的输入。25行代码和一些输入比一堵文本墙更能帮助我们帮助您。通过无效指针访问通常会导致
SIGSEGV
,而不是在
SIGABRT
@Serhio:是的,但它可以导致任何行为。这毕竟是“未定义”的意思:-)。换句话说,无论实际问题如何,您都应该检查这些内容。至于scanf,我已检查它正在扫描两个值。我需要在不允许文件i/o的网站上提交代码。是否有其他方法来处理此问题?