【问题标题】:Having Trouble Segmentation Fault in C在 C 中出现故障分割错误
【发布时间】:2013-02-22 01:57:52
【问题描述】:

我的程序的一小部分有问题,它生成一个随机数列表,然后 shell 对它们进行排序,现在它不会完成计算,这让我认为循环没有完成。我遇到了分段错误错误,但我设法通过解决我访问数组的一些问题来解决这个问题。无论如何,一双新鲜的眼睛可能对我有好处。抱歉,如果选项卡已关闭。

我认为问题在于 shell_results 数组

#include <stdio.h>
#include <stdlib.h>
#include <time.h>

int main()
{

  /*Initialize Random Array*/
  int *unsorted_list[1000000];
  int random_number;
  int i;

  for(i=0; i<1000000; i++){

    srand ( time(NULL) );
    random_number = rand();
    unsorted_list[i] = random_number; 
  }

  //Do C Shell Sort 
  double shell_results[10][2];

  double clock_diff;
  int j=1000000;
  clock_t t0, t1;
  int k;

  for(i=0;i<10;i++){
    /* Sort the list using shellSort and take the time difference */ 
    t0 = clock();
    shellSort(*unsorted_list, j);
    t1= clock();

    /*Take difference in time*/
    clock_diff = (t1 - t0); 

    /*Add time and list length to the results array*/
    shell_results[i][0] = (double)j;
    shell_results[i][1] = clock_diff;


    /*Check to make sure the array has been sorted*/
    checkSort(*unsorted_list, j);

    /*Re-initialize a longer array*/
    //j+=1000000;       
    for(k=0; k<j; k++){

      srand ( time(NULL) );
      random_number = rand();
      unsorted_list[k] = random_number; 
    }
  }

  return 0;
}

void shellSort(int *A, int n)
{
  int gap , i , j , temp; 

  for (gap = n/2; gap>0; gap /=2)
    for (i=gap; i<n; i++)
      for(j = i-gap; j>=0 && &A[j] > &A[j+gap]; j-=gap){
        temp = &A[j]; 
        A[j] = &A[j + gap]; 
        A[j + gap] = temp; 
      }
}

void checkSort(int *A, int n)
{
  int i;
  for(i=0;i<n;i++){
    if(&A[i]>&A[i+1]){
      printf("Error in sorting \n");
      break;    
    }
  }
}

【问题讨论】:

  • 你试过使用调试器吗?

标签: c shell sorting segmentation-fault


【解决方案1】:

抱歉,如果选项卡已关闭。

你能做点什么吗?如果没有,就没有必要抱歉。如果是这样,那就去做吧。

int *unsorted_list[1000000];unsorted_list的类型是什么?一百万个指向 int 的指针的数组。

unsorted_list[i] = random_number;unsorted_list[i]的类型是什么?指向 int 的指针。您确定将 int 值分配给指向 int 对象的指针是否合适?你的编译器没有警告你这一行吗?如果您将来能告诉我们有关警告的信息,那就太好了!

shellSort(*unsorted_list, j); 更正了 unsorted_list 的类型,*unsorted_list 的类型是什么?诠释。 shellSort 期望什么类型?指向 int 的指针。

    for(j = i-gap; j>=0 && &A[j] > &A[j+gap]; j-=gap){
        temp = &A[j]; 
        A[j] = &A[j + gap]; 
        A[j + gap] = temp; 
    }

&A[j] 的类型是什么?什么是温度类型?你的编译器在这里给你的警告是不好,事实上警告从来都不是好的。不要忽视他们!

你在看哪本书?

【讨论】:

    【解决方案2】:

    首先,一行

    int *unsorted_list[1000000];
    

    正在使用指针

    确实

    int unsorted_list[1000000];
    

    如果你填写它会更好

    unsorted_list[i] = random_number; 
    

    PS:srand只需使用一次。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-09-02
      • 1970-01-01
      • 2020-12-03
      • 2020-01-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多