C avançado para sistemas

Compilação, bibliotecas, apontadores, tempo de vida, strings e argumentos.

TLDR

Perguntar sobre esta página

ChatGPTClaudePerplexityGrokGeminiCopiar e abrirDeepSeekCopiar e abrir

Compilar e ligar

gcc -E, -S, -c param no pré-processamento, assembly e objeto. Só a ligação produz o executável.

ErroFaseFalta
implicit declarationcompilaçãodeclaração visível (incluir o .h)
undefined referenceligaçãodefinição (objeto ou -lX)
  • Cabeçalho declara; implementação define. -L. diz onde procurar, -lvetor o quê; a biblioteca estática entra depois dos objetos que a usam.
  • Partilhada: compilar com -fPIC, ligar com -shared; o carregador tem de encontrar a .so em execução (LD_LIBRARY_PATH).
  • -g é depuração, -Wall não é todos os avisos. Lê e corrige cada aviso.

Apontadores

C passa tudo por valor. A cópia de um endereço permite alterar o objeto, não o apontador do chamador.

int x = 5, y = 3, *p = &x, *q = p;
p = &y;   /* q continua em x */
*q = 9;   /* x passa a 9, y continua 3 */
  • p+1 avança um elemento; a[i] é *(a+i) com índice válido. O fim do array serve de limite, não de leitura.
  • sizeof a / sizeof a[0] só conta elementos no âmbito do array; em int a[] como parâmetro, passa o comprimento.
  • void * guarda endereços sem tipo: sem desreferência nem aritmética em C17.

Tempo de vida

  • Automático morre no fim do âmbito. Devolver &local é comportamento indefinido, com ou sem falha visível.
  • malloc não inicializa; calloc zera. Confere NULL, define quem liberta.
  • Em realloc, guarda o retorno num temporário. Com tamanho pedido maior que zero, a falha conserva o bloco antigo e o sucesso invalida o endereço antigo. realloc(p, 0) tem contrato que varia por edição e implementação, por isso não assumas libertação nem bloco válido.
  • Depois de free, o bloco morreu; pôr um alias a NULL não salva os outros.
Reservar, copiar e libertar
#include <stdio.h>
#include <stdlib.h>

int main(void) {
    int *original = malloc(sizeof *original);
    int *copia = malloc(sizeof *copia);
    if (original == NULL || copia == NULL) {
        free(original);
        free(copia);
        return 1;
    }
    *original = 4;
    *copia = *original;
    *copia = 9;
    printf("original=%d copia=%d\n", *original, *copia);
    free(copia);
    free(original);
    return 0;
}
Resultado

Executa o código para ver a saída e os gráficos.

Dá original=4 copia=9: dois blocos independentes, não dois nomes do mesmo inteiro.

Strings, argumentos e listas

  • "ola" ocupa 4 bytes. strlen conta até \0 numa string válida; não mede a capacidade do buffer. strcmp só garante o sinal.
  • strcpy(dst, src) exige strlen(src)+1 bytes no destino; src tem de ser uma string válida e as regiões não se podem sobrepor.
  • strcat(dst, src) exige strlen(dst)+strlen(src)+1 bytes; dst já tem de ser uma string válida e as regiões não se podem sobrepor. Não medir strlen de um destino ainda não inicializado.
  • strtok altera o buffer e trata delimitadores como conjunto; strsep pode dar tokens vazios.
  • argc inclui o nome; argv são strings. Valida com strtol (ERANGE, sem dígitos, resto) e confirma INT_MIN/INT_MAX quando precisas de int.
  • Para um máximo de números que podem ser negativos, inicializa com o primeiro valor validado, não com zero.
  • Lista vazia: cabeça NULL. Quem muda a cabeça recebe struct no **; guarda seguinte antes de free.

Detalhe das listas.

À 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.