C矩阵函数分割错误

标签 c arrays dynamic matrix segmentation-fault

当第五次调用函数 loadRow(tmpPop,bestOf4Route,k,n); 时,我有这段代码给我段错误。特别是,该函数在 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;
}
}

最佳答案

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

关于C矩阵函数分割错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14850701/

相关文章:

javascript - mousedown 不适用于动态加载的元素

c - 为什么 abs() 和 fabs() 在 C 中的两个不同的头文件中定义

c - 以正确的顺序打印链表

库函数的代码可以在可执行文件中多次包含吗?

php数组初始化

c++ - 填充二维数组随机整数相同的数字

c - N Queen 在 C 中求解,用文件中的数据替换定义

c++ - 测试指针的有效性 (C/C++)

javascript - 转换为 JSONArray

c# - 动态日志框架或技术