Ни.
// "best" style for a function which sets an integer taken by pointer
void set_int(int *p) { *p = 5; }
int i;
set_int(&i);
Или:
// then again, minimise indirection
int an_interesting_int() { return 5; /* well, in real life more work */ }
int i = an_interesting_int();
То, что языки программирования более высокого уровня занимают много места под покровом, не означает, что ваш код на C станет легче писать / читать / отлаживать, если вы продолжите добавлять ненужные выделения: )
Если вам действительно нужен int, выделенный с помощью malloc, и использовать указатель на этот int, то я бы пошел с первым (но исправленным):
void set_int(int *p) { *p = 5; }
int *x = malloc(sizeof(*x));
if (x == 0) { do something about the error }
set_int(x);
Обратите внимание, что функция set_int одинакова в любом случае . Неважно, откуда пришло целочисленное значение, находится ли оно в стеке или в куче, кому оно принадлежит, существовало ли оно долгое время или является новым. Так что это гибко. Если затем вы захотите также написать функцию, которая делает две вещи (что-то выделяет и устанавливает значение), тогда, конечно, вы можете, используя set_int
в качестве строительного блока, возможно, так:
int *allocate_and_set_int() {
int *x = malloc(sizeof(*x));
if (x != 0) set_int(x);
return x;
}
В контексте реального приложения вы можете придумать более подходящее имя, чем allocate_and_set_int
...