C矩阵函数分段错误
我有这段代码,当我的函数loadRow(tmpPop,bestOf4Route,k,n)给出了我的SEGMENTATION FAULT;被称为第五次。特别是,函数在第一个循环(在p = 3时)被正确调用。对于每个k值都可以。我不明白为什么,当我第二次执行循环(p = 7)时,第一次被称为(k = 0),当它尝试访问基类tmpPop时返回SEGMENTATION F.C矩阵函数分段错误
randperm(popSize,randomOrder);
for(p = 3;p<popSize;p+=4)
{
load_rtes(rtes,pop,randomOrder,n,p);
load_dists(dists,totalDist,randomOrder,p);
find_min(dists, 4,&m,&idx);
for(j=0;j<n;j++) bestOf4Route[j]=rtes[j][idx];
X = rand_range(1,5);
Y = rand_range(1,5);
for(k =0;k<4;k++) //Mutate the Best to get Three New Routes
{
loadRow(tmpPop,bestOf4Route,k,n);
switch(k)
{
case 1: //Flip
flipMutation(tmpPop,k,X,Y);
break;
case 2: //Swap
swapMutation(tmpPop,k,X,Y);
break;
case 3: //Slide
slideMutation(tmpPop,k,X,Y);
break;
}
}
loadnewPop(newPop,tmpPop,p,n);
}
功能是:
void loadRow(int **mat,int *array,int k,int size)
{
int j;
for(j=0;j<size;j++)
{
mat[j][k] = array[j];
}
}
的参数是:
popSize = 16
n= 8
// create 4 x N matrix
tmpPop = (int**)malloc(n * sizeof(int*));
if(tmpPop==NULL) return 1;
for (i = 0; i < n; i++) {
tmpPop[i] = (int*)malloc(4 * sizeof(int));
if(tmpPop[i]==NULL) return 1;
}
// Creates an array of n
bestOf4Route = (int*)malloc(n * sizeof(int));
if(bestOf4Route==NULL) return 1;
clear_array(bestOf4Route,n);
而且她这是调试结果:
00401865 loadRow(垫= 0x3e1438,阵列= 0x3e1698中,k = 0,大小= 8)
void load_rtes(int **rtes,int **pop,int *randomOrder, int n,int p)
{
int i,j,r;
for(i=p-3;i<=p;i++)
{
//thakes the i element of randomOrder and use it as index for the pop row
r=randomOrder[i];
// copy the pop row in rtes
for(j=0;j<n;j++)
{
rtes[j][i]=pop[j][r];
}
}
}
void randperm(int n,int *perm)
{
int i, j, t;
for(i=0; i<n; i++)
perm[i] = i;
for(i=0; i<n; i++) {
j = rand()%(n-i)+i;
t = perm[j];
perm[j] = perm[i];
perm[i] = t;
}
}
段错误意味着你访问你不允许访问的存储器区域。当指针算术错误时,这很容易发生。所以,虽然我不能告诉你问题到底在哪里,但我建议您使用一个好的调试器或一些printf()
语句来查看k
,n
和j
以查看是否超出矩阵/数组的界限。此外,您需要确保分配了适量的内存。
我使用了code :: blocks的调试器,并且用printf打印了值j,矩阵[j] [k]和数组[j],它们都可以!奇怪的是,这个函数被调用了4次,没有出错。然后,当它在for的新循环中调用时(所以k再次变为0),我不能访问矩阵(在j = 0中,所以在矩阵[j] [k]中)出现了问题。但正如你从我发布的调试中可以看到的,指向矩阵的指针不为null,j = 0。真的,我被卡住了,并且感到困惑 – Malo 2013-02-13 10:17:39
你也可以发布'load_rtes()'函数吗?您间接使用它来填充'tmpPop'。 – 2013-02-13 12:06:54
好吧,我已将它添加到问题中! – Malo 2013-02-13 13:06:54
现在你初始化'randomOrder'的代码:)你需要向我们展示**所有**代码,这些代码以某种方式与这个'loadRow'函数交互。 – 2013-02-13 13:46:46