Во-первых, a() объявляется возвращающим void, но вы пытаетесь вернуть char *. Измените подпись, чтобы вернуть char *.
Во-вторых, ваша функция прекрасна, но ваш пример кода имеет утечку памяти, потому что вы никогда не освобождаете память, на которую указывает возвращаемый указатель.
В-третьих, как указал gbrandt, вы не проверяете успех после вызова malloc. malloc может потерпеть неудачу, и проверить, действительно ли это - хорошая привычка.
Другой способ сделать это было бы передать указатель на указатель в() вместо, а затем вызывающий должен создать указатель себя перед передачей его к(), но в любом случае вы по-прежнему необходимо освободить память. Если честно, я бы пошел с вашим подходом к этому в этом случае. Нет никаких веских оснований для этого, просто подумал, что я бы сказал об этом.
void a(char **p)
{
*p = malloc(8);
if (*p)
{
**p[0] = 'a';
**p[1] = 'b';
...
**p[7] = 'h';
}
}
int main(void)
{
char *x;
a(&x);
//do something with x
.....
free(x);
}
Если этот альтернативный подход путает вас, пожалуйста, дайте мне знать, как я был бы счастлив дать объяснение (хотя, на данный момент, мне нужно, чтобы вернуться к работе!)
+1, даже если вы пропустили проблему возврата значений из 'void a()' (я почти пропустил это тоже, и @Ed победил всех нас на удар). –
Ack - хороший улов! –