首页 > 解决方案 > 在具有二维数组的程序中调试 SIGABRT 错误

问题描述

我正在尝试调试一个文本编辑器程序,在该程序中,我创建一个二维数组,每次从文件中有新输入时,它的大小都会加倍。Valgrind 返回:

==1454== Process terminating with default action of signal 6 (SIGABRT)
==1454==    at 0x48A518B: raise (raise.c:51)
==1454==    by 0x4884858: abort (abort.c:79)
==1454==    by 0x48EF3ED: __libc_message (libc_fatal.c:155)
==1454==    by 0x49919B9: __fortify_fail (fortify_fail.c:26)
==1454==    by 0x4991985: __stack_chk_fail (stack_chk_fail.c:24)
==1454==    by 0x10980C: main (in /home/utente/Desktop/main)

这是我的主要内容,我称之为重新分配数组的乐趣

int main() {
    FILE *fp;
    cmd istruction;
    char **Array = {0};
    fp=fopen("prova.txt", "rt");
    int dim=30;
 Array = Create2D(H);
 istruction=GetOrder(fp);
        while (dim<variable) {
            Array = Reallocation2D(Array,dim);
            dim=dim*2;
        }
        doing stuff...
        }
    }

    free2D(Array, dim);
    fclose(fp);
}

create 数组和 reallocation2D 是

char ** Create2D(ssize_t Strings)
{
    char **a = {0};
    a = calloc(Strings, sizeof(char *));
    return a;
}
char ** Reallocation2D(char ** a, size_t dim){
    int i;
    char **b = {0};
    b = calloc(dim*2, sizeof(char *));
    for(i=0;i<dim*2; i++)
    {
        b[i] = calloc(1024, 1);
    }
    for(i=0;i<dim;i++){
        if(a[i]) strcpy(b[i],a[i]);
    }

    for(i=0;i<dim; i++)
    {
        if(a[i]) free(a[i]);
    }

    free(a);

    return b;
}

标签: c

解决方案


没有代码,只能尝试分析 valgrind 的输出:

问题似乎发生在main()您有堆栈溢出的函数中。您是否调用定义非常大的自动数组的函数?或者你自己定义这样一个数组main()

从发布的代码来看,这里有一些问题:

  • 初始调用为指针Create2D分配空间,但您初始化为. 没有定义,它是一个for吗?Hdim30H#define30

  • 在哪里variable设置?

  • 为什么要重新分配char数组而不是复制它们?

  • 您分配1024字节大小的行。这可能比磁盘上的文件使用更多的代码内存,如果文件 os 中的行长于此,仍然不够用。

  • 为什么不使用realloc()inReallocation2D并将新分配的部分初始化为NULL指针?

  • 您应该测试分配失败并报告它。


推荐阅读