C 用2D数组调试程序中的SIGABRT错误

C 用2D数组调试程序中的SIGABRT错误,c,C,我正试图调试一个文本编辑器程序,在这个程序中,我创建了一个2D数组,每当有新的文件输入时,该数组的大小就会翻倍。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 0x

我正试图调试一个文本编辑器程序,在这个程序中,我创建了一个2D数组,每当有新的文件输入时,该数组的大小就会翻倍。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);
}

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

问题似乎发生在主函数中,其中堆栈溢出。您是否调用定义非常大的自动数组的函数?还是在main中定义这样一个数组

根据公布的代码,以下是一些问题:

对Create2D的初始调用为H指针分配空间,但将dim初始化为30。H未定义,是否定义为30

变量在哪里设置

为什么要重新分配字符数组而不是复制它们

您可以分配大小为1024字节的行。这可能会比磁盘上的文件占用更多的代码内存,如果文件操作系统中的一行超过该行,则仍然不够

为什么不在Reallocation2D中使用realloc并将新分配的部分初始化为空指针

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


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

问题似乎发生在主函数中,其中堆栈溢出。您是否调用定义非常大的自动数组的函数?还是在main中定义这样一个数组

根据公布的代码,以下是一些问题:

对Create2D的初始调用为H指针分配空间,但将dim初始化为30。H未定义,是否定义为30

变量在哪里设置

为什么要重新分配字符数组而不是复制它们

您可以分配大小为1024字节的行。这可能会比磁盘上的文件占用更多的代码内存,如果文件操作系统中的一行超过该行,则仍然不够

为什么不在Reallocation2D中使用realloc并将新分配的部分初始化为空指针

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


堆栈溢出?你在正确的位置,因为很可能你有一个。。。堆栈溢出^main可能您使用了太大的可变长度数组?如果您需要帮助,请发布代码,可能是我使用pointers@bruno:OP已经在使用Valgrind了,他发布了输出。堆栈溢出?你在正确的位置,因为很可能你有一个。。。堆栈溢出^main可能您使用了太大的可变长度数组?如果您需要帮助,请发布代码,可能是我使用pointers@bruno:OP已经使用Valgrind,他发布了输出。评论不用于扩展讨论;此对话已结束。评论不用于扩展讨论;这段对话已经结束。
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;
}