Есть куча вещей, на которые нужно обратить внимание без особого порядка серьезности
- всегда проверять аргументы
ваша программа, похоже, не проверяет аргументы, что является своего рода плохим, быстрое утверждение в начале сделает эту работу
/* Always do some argument checking, Assuming in your case command line is 2 */
if ( argc != 2 )
{
printf("Invalid arguments ");
printf("Usage %s <filename>\n", argv[0]);
exit(0);
}
- всегда проверять возвращаемые значения
Почти всегда хорошая идея проверять возвращаемые значения и проверять их, конечно, есть, например, некоторые исключения printf
, но в таких случаях, как fopen
, malloc
преступление не проверять возвращаемые значения
/* Return Type Validations are mandatory */
fp = fopen( argv[1], "r" );
if( fp == NULL )
{
printf("Error Opening file %s\n", argv[1]);
exit(0);
}
- Не приводить результат malloc
Это популярный Я разыграю результат malloc Ответ -
Это, вероятно, из-за неправильного понимания поведения функции, от man fread
The function fread() reads nmemb items of data, each size bytes long,
from the stream pointed to by stream, storing them at the location
given by ptr.
вы, по сути, в четыре раза читаете данные, которые вам нужны, написав заявление типа
count = fread( arr, size, 4, fp );
смешивание local
и global
области применения
Существует несколько объявлений переменной i
в локальном (внутри for loop
), и глобальная область не делает этого.
Осторожно при использовании sizeof()
для понитеров
этот оператор sizeof( arr )
всегда дает размер указателя, а не размер данных, на которые указывает указатель, приведенный ниже оператор
Quicksort( arr, 0, sizeof( arr ) / sizeof( int ) - 1 );
не имеет для меня особого смысла, и я никак не могу оценить, действительно ли это действительно в контексте вашей программы.