2D数组shuffle上的指针帮助

时间:2013-09-30 03:55:44

标签: segmentation-fault multidimensional-array shuffle

我试图改变至少一个2D数组的索引,以便我可以总结一个随机的N部分数组。该程序工作正常,直到我尝试调用shuffle函数并导致两种方式之一:如果我调用函数:shuffle(a [i],N);,然后我得到一个“浮点异常”错误,即使我似乎无法通过0找到任何除法或者如果我调用函数:shuffle(* a,N);,我将得到一个分段错误。我还在努力学习指针是如何工作的......任何人都可以帮忙吗?谢谢!

随机播放功能:

void shuffle(double *a, int i)
{
  int temp, randomNum, N;
  for(i=N; i>1; N--)
     {
        randomNum = rand() % N;
        temp = a[randomNum];   //create temp array
        a[randomNum] = a[i];     
        a[i] = temp; 
      }
}

主程序:

int main()
{

  srand(time(NULL));

  int i,j;
  int M = 5;
  int N = 4;
  double sum = 0.;

  double **a;
  a  = malloc(M * sizeof(double *));

  if(a == NULL) printf("Failure to allocate memory.\n");

  clock_t start = clock();
  for(i=1; i<M; i++)
    {
      a[i] = malloc(M * sizeof(double));
      if( a[i] == NULL)
    {
      printf("Failed to allocated memory for a[%d].\n", i);
      exit(0);
    }
    }

   for(i=1; i<M; i++)
     {
       for(j=1; j<M; j++)
    {
      a[i][j] = 1.0/(i+j);
      printf("a[%d][%d]=%lf\n", i, j, a[i][j]);
      shuffle(a[i], N);
      //sum = sum + a[i][j];
      //printf("shuffleda[%d][%d] and sum = %lf\n", i, j, sum);   
    }
     }

   clock_t end = clock();
   float seconds = (end - start) / (float) CLOCKS_PER_SEC;

   printf("%lf \n", sum);

  return(0);
}

1 个答案:

答案 0 :(得分:0)

void shuffle功能中存在一些错误。我对该函数进行了一些修正,它对我有用(使用英特尔的C编译器):

void shuffle(double a[], int N){
    double temp;
    int randomNum, i;
    for(i=N; i>1; i--){     
        randomNum = rand() % N;
        temp = a[randomNum];   //create temp array
        a[randomNum] = a[i];     
        a[i] = temp; 
    }
}

shuffle(a[i], N);中的来电maintemp应为双倍,而不是int。浮点异常是由于在N=0时采用了模数。

希望这有帮助。