относительно:
Image *pic= malloc(sizeof(Image));
Всегда проверяйте (! = NULL) возвращаемое значение, чтобы убедиться, что операция прошла успешно. Если не удалось, позвоните
perror( "your error message" );
, чтобы вывести на stderr
ваше сообщение об ошибке и текстовую причину, по которой система считает, что произошла ошибка.
относительно:
printf("Unable to read image: %s\n",filename);
Сообщения об ошибках должны выводиться на stderr
, а не stdout
. Рекомендуется использовать:
fprintf( stderr, "Unable to read image: %s\n %s\n", filename, strerror( errno ) );
При вызове любой из функций семейства scanf()
, например, fscanf()
, всегда проверяйте возвращаемое значение (не значения параметров), чтобы убедиться, что операция прошла успешно. Примечание. Это семейство функций возвращает количество успешных спецификаторов «преобразования входного формата».
относительно:
fscanf(f1,"%s",type);
- любое возвращаемое значение, кроме 1, указывает на ошибку.
- при использовании
%s
и / или %[...]
всегда включайте модификатор MAX CHARACTERS, который на единицу меньше длины входного буфера, чтобы избежать переполнения буфера и результирующего неопределенного поведения, потому что формат ввода этих Спецификаторы преобразования всегда добавляют NUL-байт ко входу.
относительно:
pic->pixels = (int **)malloc(sizeof(int *) * pic->height);
в C, возвращаемый тип - void*
, который может быть назначен любому указатель. Кастинг просто загромождает код. Предложите удалить приведение.
для удобства чтения и понимания:
- отдельные блоки кода:
for
if
else
while
do...while
switch
case
default
следует разделить одной пустой строкой. последовательно отступать от кода. Отступ после каждой открывающей скобки '{'. Отступ перед каждой закрывающей скобкой '}'. Предложите для каждого уровня отступа 4 пробела
вставьте соответствующее горизонтальное пространство: внутри скобок, внутри скобок, внутри скобок, после запятых, после точек с запятой, около C операторов
функция: malloc()
ожидает, что параметр имеет тип size_t
, однако; операторы типа:
edges->pixels = (int **)malloc(sizeof(int *) * img->height);
передаются int
как часть параметра. (IE img->height
) Это приводит к неявному преобразованию между int
и size_t
, которое «обычно» безвредно, но все же является рискованным преобразованием.