【问题标题】:C matrix function segmentation faultC矩阵函数分段错误
【发布时间】:2013-02-13 09:53:55
【问题描述】:

当函数 loadRow(tmpPop,bestOf4Route,k,n); 被第五次调用时,我有这段代码给我 SEGMENTATION FAULT。特别是,该函数在 fro 的第一个循环中被正确调用(当 p=3 时)。对于每个 k 值都可以。不明白为什么,第二次执行循环(p=7),第一次调用(k=0),尝试访问矩阵tmpPop时返回SEGMENTATION F。

      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(mat=0x3e1438, array=0x3e1698, k=0, size=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;
}
}

【问题讨论】:

  • 你能把load_rtes()的功能也发一下吗?您使用它间接填充tmpPop
  • 好的,我已将其添加到问题中!
  • 现在是你初始化randomOrder的代码:) 你需要向我们展示所有loadRow函数交互的代码。跨度>
  • 如果我这样做,您确定他们不会关闭我的问题吗?我已经添加了它:) 这是在 for 循环之前调用的函数 randperm()
  • 如果您评论loadnewPop(newPop,tmpPop,p,n);这一行,您是否也会遇到Segfault?

标签: c arrays dynamic matrix segmentation-fault


【解决方案1】:

Segfault 意味着您访问了不允许访问的内存区域。当指针算术错误时,这很容易发生。所以,虽然我不能告诉你问题到底出在哪里,但我建议你使用一个好的调试器或一些printf() 语句来查看knj,看看你是否超出了界限的矩阵/数组。此外,您需要确保分配了正确的内存量。

【讨论】:

  • 我使用了 code::blocks 的调试器,并用 printf 打印了 j、matrix[j][k] 和 array[j] 的值,它们都可以!奇怪的是,该函数被调用了 4 次,都没有出错。然后,当在 for 的新循环中调用它时(因此 k 再次变为 0),我无法访问矩阵(在 j=0 中,因此在矩阵 [j][k] 中)出现问题。但正如你从我发布的调试中看到的那样,指向矩阵的指针不是 null 并且 j = 0。我真的很困惑
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-05-28
相关资源
最近更新 更多