Memória, funções e objetos em C
Duração dos objetos, stack frames, propriedade da memória e apontadores para funções.
Duração e passagem de parâmetros
| Objeto | Duração |
|---|---|
| Automático de um bloco | Até sair do bloco |
Global ou static | Execução do programa |
| Alocação dinâmica | De malloc bem-sucedido até free |
C passa argumentos por valor. *p = 9 pode alterar o objeto do chamador, mas p = NULL altera apenas a cópia local do apontador. Para substituir o apontador do chamador, devolve o novo valor ou recebe int **.
Nunca devolvas o endereço de um objeto automático: deixa de existir no retorno, mesmo que um teste ainda leia os mesmos bits. A convenção conserva retorno e contexto, mas C não exige stack frames em memória; argumentos podem ir em registos.
Alocação e propriedade
malloc(n * sizeof *p)devolve memória não inicializada ouNULL. Valida overflow do produto, a falha e os dados antes de os ler. Define quem liberta, exatamente uma vez; copiar um apontador não cria outro objeto.- Depois de
free, os apontadores que designavam o objeto têm valor indeterminado. Pararealloccom tamanho não nulo, guarda o resultado num temporário: na falha o bloco antigo continua válido, no sucesso usa o endereço devolvido. Trata tamanho zero separadamente. - Uma
structpode conter padding; umaunionpartilha armazenamento e precisa de etiqueta da alternativa ativa. Não envies estruturas cruas num protocolo: serializa campos com larguras e ordem de bytes definidas.
Alinhamento e tamanho
Com char 1, short 2 e int 4, os campos char[10], int, short começam em 0, 12 e 16 e a struct ocupa 20 bytes com padding. A union ocupa 12. Estas contas dependem da ABI indicada; sizeof, _Alignof e offsetof verificam a implementação.
Fila circular
Com capacidade , conserva in, out e count. Avança cada índice módulo ; count = 0 significa vazio e count = C significa cheio. in == out pode ocorrer nos dois casos. A cópia de elementos com apontadores é superficial; realocar o array não reorganiza uma fila que atravessou o fim.
Funções e interfaces
int (*operation)(int)aponta para uma função;int *operation(int)declara uma função que devolve apontador. Um cast não adapta assinaturas; valida índices de tabelas.- Um tipo incompleto, como
struct sprite;, permite uma interface opaca. Funções com...exigem contrato de contagem e tipos (va_start,va_arg,va_end);floatpromove-se paradoublee inteiros pequenos normalmente paraint.