使用指针排序数组,没有任何索引变量

时间:2016-04-21 16:24:15

标签: c arrays sorting pointers

我正在尝试使用指针排序数组,也不使用索引变量

void sort(int *a,int n)
{
  int *temp;
  *temp=0;
  int *b=a;
  for(;a<a+n-1;a+=1)
    {
      for(b=a+1;b<b+n;b+=1)
        {
          if(*a>*b)
          {
            *temp=*a;
            *a=*b;
            *b=*temp;
          }
        }
    }
}

不使用指针的上述程序的等效版本是

void sort(int a[],int n)
{
  int i,j,temp;
  for(i=0;i<n-1;i++)
    {
      for(j=i+1;j<n;j++)
        {
          if(a[i]>a[j])
          {
            temp=a[i];
            a[i]=a[j];
            a[j]=temp;
          }
        }
    }
}

我正在做一个运动问题,我刚开始自己​​学习指针。我相信我做得对,因为我试图避免使用索引变量。我收到错误segmentation fault : 11。我在这里失踪了什么? 这个程序错了吗?或者这个想法本身是错的?反馈意见。

4 个答案:

答案 0 :(得分:3)

这两行是错误的:

int *temp;
*temp=0;

在第一行中,您声明一个指针变量。此变量指向某处,但只要您不为此变量指定任何值,就无法知道它指向的位置。

然后,在第二行中,您说:temp指向的地方,将零写入该存储单元格。所以程序写入一个随机的未知地址。

在您的情况下,temp根本不应该是指针,因为您以后需要它来存储int

作为一般规则,您不应将参数更改为函数,在本例中为a。而是创建一个局部变量。这样可以防止您比较b<b+n代码中的其他错误。对于除溢出之外的所有情况,该表达式可以转换为0<n。表达式应该是p<a+n,其中p是您的新本地变量。

答案 1 :(得分:2)

a<a+n-1 - 如果n&gt;那总是如此1。

BTW,参数int a[]衰减为指针。

答案 2 :(得分:2)

*temp=0; 
不允许

:您尚未为temp

分配内存

使用:

int temp;

或做

 int *temp;
   temp=malloc(1*sizeof(*temp)); // The dirty way.

答案 3 :(得分:2)

Omnibus版本(UB =未定义的行为=错误和错误):

void sort(int *a,int n)
{
  int *temp;
  *temp=0;  // UB: assignment to uninitialized pointer
  int *b=a;
  for(;a<a+n-1;a+=1) // UB: a<a+n-1 is always true so this is infinite
    {

首先,根据sjsam的回答,我们将int *temp替换为int temp=0

void sort(int *a,int n)
{
  int temp=0;  // not an index variable, doesn't have to change to pointer

留下无限循环:你需要记住数组在迭代时的结束位置:

  int *begin = a;
  int *end = a + n; // one-past-the-end for a half-open interval
  for (int *i = begin; i < end; ++i) {

请注意,您需要对嵌套循环进行等效更改,*temp在元素交换中应该只是temp