核心转储,如何增加矩阵维度(可用),在 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 中使用 free() 时出现无效(中止)核心转储错误