使用指针:对整数数组进行排序的程序,分段错误

时间:2017-03-27 14:02:38

标签: c arrays loops sorting pointers

我正在尝试使用以下属性创建一个程序:使用原型int * max_sorted(int array [],int laenge,int max)编程,它对数组中的整数进行排序。在堆上创建一个大小为max + 1的整数数组,并用零填充所有位置。然后读取给予该函数的数组。如果读取整数x,则位置x处堆上的数组值将增加1。然后重写数组:如果读取堆上数组的位置i的值n,则在数组(当前位置)中写入n次。下面的代码给出了分段错误:

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

int *max_sorted(int array[],int laenge, int max){
  int k,l;
  int *ptr;

  ptr= malloc((max+1)*sizeof(int)); /*allocates memory for new array*/
  if(ptr==NULL || max<0){
    return NULL;   /*error*/
  }
  for(k=0; k<max+1; k++){      /*sets all values of ptr array to 0*/
    ptr[k]=0; 
  }


  for(k=0;k<laenge;k++){               
    ptr[array[k]]++;      
   }



  for(k=0;k<max+1;k++){
    if(ptr[k]!=0){
    array[k-l]=k*ptr[k]; 
    }
    else{
      l++;
    }
  }




  free(ptr);
  return array;
}





int main(void){


  int array[3]={2,1,3};
  int laenge=3;
  int max=3;
  int k;
  int*ptr;
  ptr=max_sorted(array,laenge,max);
   for(k=0;k<laenge;k++){
    printf("%d",ptr[k]);
   } 



    return 0;
}

编辑:现在正常工作的更正版本可以在下面查看:

int *max_sorted(int array[],int laenge, int max){
  int k;
  int l=0;
  int *ptr;
  int i=0;

  ptr= malloc((max+1)*sizeof(int)); /*allocates memory for new array*/
  if(ptr==NULL || max<0){
    return NULL;   /*error*/
  }
  for(k=0; k<max+1; k++){      /*sets all values of ptr array to 0*/
    ptr[k]=0; 
  }


  for(k=0;k<laenge;k++){               
    ptr[array[k]]++;      
   }


  for(k=0;k<max+1;k++){
    l=ptr[k];
    while(l>0){
      array[i]=k;
      i++;
      l--;
    }

  }


  free(ptr);
  return array;
}

1 个答案:

答案 0 :(得分:0)

EDITED发布的代码仍然不正确。

以下是

的代码版本
  1. 干净地编译
  2. 执行所需的功能
  3. 仍取决于数组的内容以避免未定义的行为
  4. 现在是代码

    #include <stdio.h>   // printf()
    #include <stdlib.h>  // calloc(), free(), exit(), EXIT_FAILURE
    
    
    
    int *max_sorted(int array[], 
                    size_t laenge, 
                    size_t numElementsInArray);
    
    
    
    int main( void )
    {
        int array[] = { 2,1,3 };
        size_t laenge=3;
    
        size_t k;
        int*ptr;
    
        ptr=max_sorted( array, laenge, sizeof( array )/sizeof(int) );
    
        for( k=0; k<(sizeof( array )/sizeof(int)); k++)
        {
            printf( "%d ", ptr[k] );  //<-- note space in format string
        }
    
        return 0;         // <-- in modern C, when main returns 0, this line not needed
    } // end function: main
    
    
    int *max_sorted( int array[],      // array to be sorted
                     size_t laenge,    // largest value in array
                     size_t numElementsInArray ) 
    {
        int *ptr = calloc( numElementsInArray+1, sizeof(int) ); /*allocates memory for new array*/
        if(!ptr)
        { // then calloc failed
            perror( "calloc for temporary array failed" );
            exit( EXIT_FAILURE );
        }
    
        // implied else, malloc successful
    
        for( size_t i=0; i<laenge; i++ )
        {
            ptr[ array[i] ]++;      // <-- this will have undefined behavior
                                    //     when array[i] > 3
        }
    
        size_t index2 = 1;
        for( size_t index1=1; index1<(numElementsInArray+1); index1++ )
        {
            if( ptr[index1] )
            {
                array[index1-index2] = (int)index1 * ptr[index1];
            }
    
            else
            {
                index2++;
            }
        }
    
        free(ptr);
        return array;
    } // end function: max_sorted
    

    以上代码的输出是:

    1 2 3