我正在尝试使用以下属性创建一个程序:使用原型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;
}
答案 0 :(得分:0)
EDITED发布的代码仍然不正确。
以下是
的代码版本现在是代码
#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