Nos meus programas em C, muitas vezes preciso de uma maneira de fazer uma representação em string dos meus ADTs. Mesmo que eu não precise imprimir a string para a tela de alguma forma, é interessante ter esse método para depuração. Portanto, esse tipo de função geralmente surge.
char * mytype_to_string( const mytype_t *t );
Realmente percebo que tenho (pelo menos) três opções aqui para manipular a memória para a sequência retornar.
Alternativa 1: Armazenando a sequência de retorno em uma matriz estática de caracteres na função Não preciso pensar muito, exceto que a corda é substituída a cada chamada. O que pode ser um problema em algumas ocasiões.
Alternativa 2: aloque a string na pilha com malloc dentro da função. Muito legal, pois não precisarei pensar no tamanho de um buffer ou na substituição. No entanto, eu tenho que lembrar de liberar () a string quando terminar, e também preciso atribuir a uma variável temporária para que eu possa liberar. e, em seguida, a alocação de heap é realmente muito mais lenta que a alocação de pilha; portanto, haverá um gargalo se isso for repetido em um loop.
Alternativa 3: Passe o ponteiro para um buffer e deixe o chamador alocar esse buffer. Gostar:
char * mytype_to_string( const mytype_t *mt, char *buf, size_t buflen );
Isso traz mais esforço para o chamador. Percebo também que essa alternativa me dá uma outra opção na ordem dos argumentos. Qual argumento devo ter primeiro e último? (na verdade seis possibilidades)
Então, qual devo preferir? Algum porque? Existe algum tipo de padrão não escrito entre os desenvolvedores C?
sysctlbyname
no OS X e iOS