核心转储,如何增加矩阵维度(可用),在 C 中释放 2d 指针时出错

Posted

技术标签:

【中文标题】核心转储,如何增加矩阵维度(可用),在 C 中释放 2d 指针时出错【英文标题】:Core dumped, how to increase matrix dimension(usable), error in freeing 2d pointer in C 【发布时间】:2017-08-26 16:00:41 【问题描述】:

这是一个简单的程序。目标是,

    删除核心转储错误或以某种方式处理更大维度的矩阵。虽然,我使用了动态内存分配。 在这个程序中,我为释放指针做了一个注释,如果我不做注释就会出错。但据我所知,列应该比指针行首先空闲,这不是在这里发生的,为什么会这样? 如果有任何方法可以优化此代码或建议或改进或编程的好习惯,欢迎您

程序在这里,

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

        int main () 

        
           int i,j,N=724; // core dumped start from 724 (least) on my laptop
           double complex var[N][N], **array;//, **var1, **var2,;

        // ALLOCATIONG 2D ARRAY
        array = malloc(N * sizeof *array + (N * (N * sizeof **array))); 

        // SOMETHING WITH "var" AND ASSIGN TO 2D POINTER "array"
        for ( i = 0; i < N; i++) 
        for ( j = 0; j < N; j++) 
        var[i][j] = (i+j)+((i+50)*j)*I;// SOMETHING WITH "var"
        printf("Value of var 1st time[%i,%i] = %f\t%f\n", i,j, var[i][j], cimag(var[i][j]));
        
         
        for ( j = 0; j < N; j++) 
        *(array+j)=&var[j][0];//ASSIGNING TO POINTER
        

        printf("\n\n\n\n");
        for ( i = 0; i < N; i++) 
        for ( j = 0; j < N; j++) 
        printf("Value of array[%i,%i] = %f\t%0f\n", i,j, creal(*(*(array+i)+j)),cimag(*(*(array+i)+j)) );
        
        

        /* // BLOW LOOP FOR FREEING, GIVES ERROR
        for (int i=0; i<N; i++) 
          free(array[i]);
        
        */
        free(array); // THIS IS (MAY BE, I DON'T KNOW) FOR ONLY FREEING ROW POINTERS

         return 0;
        

【问题讨论】:

你有足够大的堆栈来容纳 524176 个数组元素吗? 我不知道如何检查堆栈内存。但是我的内存(RAM)在运行时大约有 5.8 GB(大约 8 GB)是可用的。 程序栈不会得到所有这些,它被分配了一个特定的数量,而且不是很多。程序堆栈不会从可用资源中动态增长。我不明白为什么代码定义了这个大型本地数组,然后分配内存以指向其元素。为什么不只为数据本身分配内存? 对不起,但我的(核心)领域不是计算机科学,所以我可能无法理解。但最终我想让事情正常工作,所以我问了。感谢您推荐类似“Valgrind”的工具。我不知道这些工具。 你的意思是 var[N][N] 吗?而不是我将其值分配给数组,而不是直接?实际上我已经这样做了,但是即使在那之后 N=724 也是极限。所以我认为可能还有其他错误,因为限制应该上升。 【参考方案1】:

错误原因是释放未动态分配的内存。

这里

double ** array = malloc(X * sizeof(double *));

您已为指向 double 的 X 指针分配了空间,但没有为任何这些指针分配空间。

对于每个指针/行,您必须分别分配空间,否则取消引用它们会导致未定义的行为。

Here is example how to work with array of pointers which you should apply on your usecase.


也不是这种语义

*(array+j)

你应该使用(为了更好的可读性)

array[j]

【讨论】:

谢谢,菲利普。我的动态分配方法错了吗?有没有其他方法可以按照我定义的方式释放内存?核心转储呢? 不是我的 DV,但double ** array = malloc(N * sizeof *array + (N * (N * sizeof **array))); 的整个想法很奇怪。 当然这很奇怪,但它的 OP 代码。 @STRANGE 请看一下HERE(click),希望您了解如何分配/释放指针数组。 我很高兴它对您有所帮助,我(可能还有其他人)可以建议您以更小的步骤创建程序。创建一个大程序然后调试它不是最好的方法,即使对于没有经验的人也是如此。制作小而清晰且正确的步骤 :-) 更容易理解和发现错误。 @STRANGE 在这里查看 -- ideone.com/xuq0dG。我不得不删除这些复杂的东西,因为我没有那个库,但它现在可以编译,所以只需添加“复杂”和这些函数,它应该运行良好:-)

以上是关于核心转储,如何增加矩阵维度(可用),在 C 中释放 2d 指针时出错的主要内容,如果未能解决你的问题,请参考以下文章

分段错误(核心转储)c

在 C 中使用 free() 时出现无效(中止)核心转储错误

Python:如何在不扩展矩阵的情况下增加矩阵的维度?

什么原因导致C中出现分段错误(核心转储)?

在Linux机器上运行C代码时出现分段错误(核心转储)[关闭]

使用动态二维数组时的 C++ 分段错误(核心转储)