Все зависит от того, что вы пытаетесь сделать. Если возможно, лучше сделать malloc / free в той же области, IMO, это делает код намного более читабельным - выделение памяти в C уже достаточно сложно. В вашем случае вы должны сначала выполнить malloc, вызвать функцию и освободиться после выхода за пределы функции. Но, конечно, это не всегда возможно.
Некоторые из ваших решений не будут работать: второе, например, не будет выполнять то, что вы хотите, потому что при вызове функции указатель копируется :
char *p;
function(p);
void function(char *q) {
// q is a copy of p, so when q is set by malloc, it will not be reflected in p
q = malloc(100);
}
Как правило, вы должны выполнять функции fopen: вы возвращаете указатель:
char* p function() {
char* ret;
ret = malloc(100);
return ret;
}
char *p = function();
Или вы можете использовать указатель на указатель:
char *p;
function(&p);
void function(char **q) {
// q is a copy of &p, so when *q is set by malloc, it is the same memory location as &p
*q = malloc(100);
}
Я думаю, что первый намного лучше, хотя, в целом.
Кроме того, что касается вашего стиля: sizeof (char) бесполезен, он всегда равен 1 по определению, независимо от того, какой компилятор / платформа вы используете, и приведение malloc бесполезно и действительно опасно (потому что оно скрывает отсутствие включения заголовка, где malloc объявлен). Это полезно, только если вы используете malloc в C ++ (где приведение является обязательным).