【发布时间】: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 也是极限。所以我认为可能还有其他错误,因为限制应该上升。
标签: c pointers memory-management complex-numbers coredump