Memória, funções e objetos em C

Duração dos objetos, stack frames, propriedade da memória e apontadores para funções.

TLDR

Perguntar sobre esta página

ChatGPTClaudePerplexityGrokGeminiCopiar e abrirDeepSeekCopiar e abrir

Duração e passagem de parâmetros

ObjetoDuração
Automático de um blocoAté sair do bloco
Global ou staticExecução do programa
Alocação dinâmicaDe 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 ou NULL. 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. Para realloc com 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 struct pode conter padding; uma union partilha 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 C>0C>0, conserva in, out e count. Avança cada índice módulo CC; 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); float promove-se para double e inteiros pequenos normalmente para int.

Alocação, aliases e realocação.

À tua maneira

Aparência

Modo de cor
Tema
Cor de destaque

Leitura

Fonte de leitura

Álgebra, lógica e uma ideia de cada vez.

Código

Fonte do código

Navegação

Cursor de leitura, sem edição. h, j, k, l movem; / pesquisa nesta página. v seleciona caracteres; V seleciona linhas; y copia. Tab permite destacar ou comentar. Espaço ou Enter abre blocos recolhíveis. Nos cartões, h, j, k, l mudam o foco.

CSS personalizado

Ativa uma sugestão ou guarda o teu CSS. Só muda este navegador.

Usa --page, --text e --accent para acompanhar o tema.

Seletores e recuperação

.site-header, .prose, .course-card, [data-reading-history], [data-playground] e .page-actions.

Abre a aparência com a tecla vírgula ou no rodapé. Se o CSS esconder os controlos, abre esta página sem CSS personalizado.

Pesquisar

Escreve para pesquisar em todo o site.

para escolher · Enter para abrir · Esc para fechar

Copiar fórmula

A cópia automática não está disponível. Copia o LaTeX abaixo.

Pesquisar nesta página

Enter procura · n / N repetem · Esc cancela. Ctrl / Cmd K pesquisa todo o site.

Atalhos de teclado

Clica numa tecla para a mudar. Esc cancela. Backspace desativa.

PesquisarCtrl / Cmd K

Os atalhos não interferem enquanto escreves. Tab e Enter funcionam sempre.