Image new_Image(const int height, const int width, const int depth)
Безопасно, но вы возвращаете всю структуру по значению - что не очень эффективно, и большинство реализаций выполнит это через стек.Стек особенно на небольших встроенных системах очень ограничен в размерах.Также не подходит для рекурсии (много стеков используется при каждом вызове функции)
Image *new_Image(const int height, const int width, const int depth) {
Image out;
- неопределенное поведение при возврате указателя на локальную переменную, которая перестает существовать при выходе из функции.
Image *new_Image(Image *out, const int height, const int width, const int depth)
безопасно, если выиспользовать объекты, определенные или выделенные вне функции.Кстати, вы забыли вернуть указатель.
Опция, которую вы не упомянули в своем вопросе:
Image *new_Image(const int height, const int width, const int depth) {
Image *out = malloc(sizeof(*out));
/* malloc result tests */
out -> width = width;
out -> height = height;
out -> depth = depth;
out -> pixels = calloc((height*width*depth), sizeof(float));
/* calloc result tests */
return out;
}
Вы не проверяете свойрезультаты распределения памяти.Это должно быть сделано.
Эта функция также неверна:
Image *new_Image(Image *out, const int height, const int width, const int depth) {
out.width = width;
out.height = height;
out.depth = depth;
out.pixels = (float*) calloc((height*width*depth), sizeof(float));
}
Это должно быть:
Image *new_Image(Image *out, const int height, const int width, const int depth) {
out -> width = width;
out -> height = height;
out -> depth = depth;
out -> pixels = calloc((height*width*depth), sizeof(float));
return out;
}
Вам не нужно приводить результатыМаллок семейные функции.Считалось опасным, так как при использовании всех стандартных языков вы не получите никаких предупреждающих сообщений, если забудете включить.В настоящее время компиляторы выдают предупреждения, если вы вызываете функцию без прототипа
Если вы компилируете свой код с помощью компилятора C ++, используйте параметры командной строки, которые сообщат компилятору, что код является C (например, параметр gcc или g ++ -xc)