C 使用free()会创建分段错误
我有一个问题,我似乎无法解决我的内存分配 我使用malloc创建了3个动态分配的数组(ipiv、k、b),但是当我尝试释放它们时,我得到了一个seg错误。如果我不释放它们,代码就可以正常工作(但是如果我运行太多的迭代,我就会耗尽内存) 这是代码。。。我去掉了所有不使用3个数组的部分,因为代码相当长C 使用free()会创建分段错误,c,segmentation-fault,malloc,free,C,Segmentation Fault,Malloc,Free,我有一个问题,我似乎无法解决我的内存分配 我使用malloc创建了3个动态分配的数组(ipiv、k、b),但是当我尝试释放它们时,我得到了一个seg错误。如果我不释放它们,代码就可以正常工作(但是如果我运行太多的迭代,我就会耗尽内存) 这是代码。。。我去掉了所有不使用3个数组的部分,因为代码相当长 #include<stdio.h> #include <string.h> #include<stdlib.h> #include<math.h> #i
#include<stdio.h>
#include <string.h>
#include<stdlib.h>
#include<math.h>
#include <mpi.h>
#include "mkl.h"
#define K(i,j) k[(i)+(j)*(n)]
void dgesv_( const MKL_INT* n, const MKL_INT* nrhs, double* a,
const MKL_INT* lda, MKL_INT* ipiv, double* b,
const MKL_INT* ldb, MKL_INT* info );
int main()
{
int *ipiv=malloc(n*sizeof(int));
for (i=0; i<n; i++) {
ipiv[i]=0;
}
for (globloop=0; globloop<=lasti; globloop++) {
double a[ndofs];
double rhs[ndofs];
double F[ndofs];
double *k=malloc(n*n*sizeof(double));
//var for stiffness matrix (this is the one acutally fed to dgesv)
//see define at top
for (i=0; i<n; i++) {
for (j=0; j<n; j++) {
K(i,j)=0.0;
}
}
//bunch of stuff modified, a,rhs,and F filled... ect
while (sos>=ep && nonlinloop<=maxit) {
double KFull[ndofs][ndofs];
for (i=0; i<ndofs; i++) {
for (j=0; j<ndofs; j++) {
KFull[i][j]=0.0;
}
}
//KFull filled with values..
//trim the arrays to account for bcs
double *b=malloc(n*sizeof(double));
for (i=0; i<n; i++) {
b[i]=rhs[i+2];
}
//k array filled
//see define above
for (i=0; i<n; i++) {
for (j=0; j<ndofs-2; j++) {
K(i,j)=KFull[i+2][j+2];
}
}
//SOLVER
dgesv_(&n,&one,k,&n,ipiv,b,&n,&info);
//now we must take our solution in b, and place back into rhs
for (i=0; i<n; i++) {
rhs[i+2]=b[i];
}
nonlinloop++;
free(b);
}
free(k);
}
free(ipiv);
return 0;
}
#包括
#包括
#包括
#包括
#包括
#包括“mkl.h”
#定义K(i,j)K[(i)+(j)*(n)]
无效dgesv(常数MKL_INT*n,常数MKL_INT*nrhs,双*a,
常数MKL_INT*lda,MKL_INT*ipiv,双*b,
常数MKL_INT*ldb,MKL_INT*info);
int main()
{
int*ipiv=malloc(n*sizeof(int));
对于(i=0;i如果n=ndofs-4
(如OP的评论中所述),则ndofs-2
大于n
。然后该代码将在此时损坏内存
K(i,j)=KFull[i+2][j+2];
因为j
运行到ndofs-2-1
并且K
被(仅)定义为K[0..n-1][0..n-1]
用valgrind运行它,它会告诉你哪里出了问题。ndofs-2
是否可能大于n
?不,它们被特别设置为n=ndofs-4。我知道这并不能解决你的问题,但为了性能起见,我会在所有循环之外只分配一次所有三个数组并重用它们。Their大小似乎与迭代无关,您在每个循环结束时都会丢弃它。在两种情况下,您只需要动态内存:您打算在函数范围之间传输它,或者它太大而无法放入堆栈。堆栈位于非嵌入式系统中,通常大2-8Mb。如果您的数组适合堆栈,我甚至会将它们放在那里。另一种情况是欣:你确定dgesv\uu
还没有释放它们吗?对已经释放的指针调用free
通常是SIGSEGV
。