C Erros Comuns

Quando algo dá errado, o C fala inglês, em frases curtas e às vezes misteriosas. Esta página junta as mensagens que você mais vai ver, em três momentos: na compilação (o gcc), na ligação (o ld) e na execução (o seu programa caindo). Cada uma vem com o que ela quer dizer, como consertar e a aula onde o assunto é explicado. Todas foram provocadas de verdade.

Como usar esta página
  • Copie um pedaço da mensagem que apareceu para você (por exemplo, undeclared) e procure aqui com Ctrl+F.
  • Os programas ficam na pasta ~/c/erros da Ana e foram compilados com o comando padrão do guia: gcc -std=c23 -Wall -Wextra arquivo.c -o programa. No seu computador, o nome do arquivo e o número da linha serão outros; o texto da mensagem é o mesmo.
  • As mensagens do gcc saem em inglês, com aspas tipográficas ‘assim’. As do ligador e do terminal saem em português na máquina da Ana, porque esses programas têm tradução instalada; a versão em inglês aparece ao lado, porque é a que você vai achar nos fóruns.
  • O editor do guia usa o Clang, não o gcc: as mensagens dizem a mesma coisa com outras palavras. Por isso, cada tabela tem as duas colunas. Veja também O Editor do Guia.

Atalhos: Ler uma mensagem · Compilação, ligação ou execução? · Erros de compilação · Avisos · Erros de ligação · Erros do terminal · Erros de execução · Códigos de saída · Experimente


Como ler uma mensagem do gcc

#include <stdio.h>

int main(void) {
    int idade = 29;
    printf("%d\n", idad);
    return 0;
}
$ gcc -std=c23 -Wall -Wextra e01.c -o e01
e01.c: In function ‘main’:
e01.c:5:20: error: ‘idad’ undeclared (first use in this function); did you mean ‘idade’?
    5 |     printf("%d\n", idad);
      |                    ^~~~
      |                    idade
e01.c:5:20: note: each undeclared identifier is reported only once for each function it appears in
e01.c:4:9: warning: unused variable ‘idade’ [-Wunused-variable]
    4 |     int idade = 29;
      |         ^~~~~
PedaçoO que quer dizer
e01.c: In function ‘main’:Contexto: "dentro da função main". Não é um erro; diz onde estão os próximos.
e01.c:5:20:arquivo:linha:coluna. Linha 5, coluna 20. Os editores de código pulam direto para lá.
error:O tipo. error impede o programa de ser criado; warning (aviso) deixa criar, mas aponta algo suspeito; note (nota) é uma informação extra sobre a mensagem de cima; fatal error para tudo na hora.
‘idad’ undeclared (first use in this function)O texto: "idad não foi declarada (primeiro uso nesta função)".
did you mean ‘idade’?Uma sugestão: "você quis dizer idade?". Embaixo do código, a linha idade mostra como ficaria.
5 | printf(…);
| ^~~~
A linha do código, com o ^ apontando a coluna e os ~ sublinhando o trecho.
[-Wunused-variable]O nome do aviso, isto é, a opção que o liga. Útil para procurar na internet.

Conserte sempre o primeiro erro primeiro. Um erro costuma provocar outros em cascata: aqui, o aviso unused variable ‘idade’ só existe por causa do erro de digitação. E o erro de verdade pode estar antes da linha apontada (um ; que faltou na linha de cima, por exemplo). Aula: Lendo Erros do Compilador.

Compilação, ligação ou execução?

FaseQuem reclamaComo reconhecerO programa existe?Aula
Compilaçãoo compilador (gcc, cc1)arquivo.c:linha:coluna: error:nãoLendo Erros
Ligaçãoo ligador (ld), chamado pelo gccreferência não definida para (undefined reference to) e, no fim, collect2: error: ld returned 1 exit status; não há número de linhanãoComo o C Vira Programa
Execuçãoo sistema, ou a biblioteca Co programa começa, e então aparece Falha de segmentação, Abortado, ***…sim, e caiuDepurar com gdb
Terminalo bashbash: … (nem chegou a rodar o seu programa)talvezCompilar com gcc

Erros de compilação

Cada linha desta tabela é um programa pequeno, provocado de propósito. A coluna do gcc mostra só o texto principal (sem arquivo:linha:coluna).

Código com o errogcc 15Clang (editor)O que significa e como consertarAula
printf("%d\n", idad);‘idad’ undeclared (first use in this function); did you mean ‘idade’?use of undeclared identifier 'idad'; did you mean 'idade'?Nome que não existe: erro de digitação, variável declarada depois ou dentro de outro bloco. Confira a grafia (maiúsculas contam).Variáveis
int preco = 10
(sem ;)
expected ‘,’ or ‘;’ before ‘printf’ (aponta a linha seguinte)expected ';' at end of declarationFaltou o ; no fim da linha de cima.Sintaxe
dobro(4) antes de int dobro(int n) {…}implicit declaration of function ‘dobro’ [-Wimplicit-function-declaration]use of undeclared identifier 'dobro'A função foi usada antes de ser declarada. Ponha um protótipo (int dobro(int n);) antes do main, ou a função inteira.Protótipos
printf sem #include <stdio.h>implicit declaration of function ‘printf’ + note: include ‘<stdio.h>’ or provide a declaration of ‘printf’call to undeclared library function 'printf' with type 'int (const char *, ...)' + note: include the header <stdio.h>Faltou o #include. Os dois dizem qual.Arquivos .h
um { sem o }expected declaration or statement at end of inputexpected '}' + note: to match this '{'O arquivo acabou com uma chave aberta. Conte as chaves; um editor com indentação automática ajuda a ver qual ficou sem par.Sintaxe
printf("%d\n", (2 + 3);expected ‘)’ before ‘;’ tokenexpected ')' + note: to match this '('Parêntese aberto e não fechado.Sintaxe
printf("Olá, mundo!\n);missing terminating " charactermissing terminating '"' character + expected expressionFaltou fechar as aspas.Escapes
printf(“Olá”);
(aspas curvas, copiadas de um site ou de um documento)
stray ‘\342’ in programunexpected character <U+201C>"Caractere perdido": as aspas “ ” não são as " do C. Apague e digite de novo no editor de código.Acentos e UTF-8
string nome = "Ana";unknown type name ‘string’; did you mean ‘stdin’?use of undeclared identifier 'string'; did you mean 'stdin'?O C não tem tipo string (isso é de outras linguagens). Use char nome[] = "Ana";.Strings
char nome[20]; nome = "Ana";assignment to expression with array typearray type 'char[20]' is not assignableNão se atribui um array com =. Inicialize na declaração (char nome[20] = "Ana";) ou copie: snprintf(nome, sizeof nome, "%s", "Ana").Funções de String
int idade = "29";initialization of ‘int’ from ‘char *’ makes integer from pointer without a cast [-Wint-conversion]incompatible pointer to integer conversion initializing 'int' with an expression of type 'char[3]'"29" é texto. Escreva 29, ou converta com strtol.Texto ↔ Número
dobrar(x); com void dobrar(int *p)passing argument 1 of ‘dobrar’ makes pointer from integer without a cast + note: possible fix: take the address with ‘&’incompatible integer to pointer conversion passing 'int' to parameter of type 'int *'; take the address with &A função quer um endereço: dobrar(&x).Passar por Ponteiro
int *p = &preco; com double precoinitialization of ‘int *’ from incompatible pointer type ‘double *’ [-Wincompatible-pointer-types]incompatible pointer types initializing 'int *' with an expression of type 'double *'O ponteiro tem de ser do tipo da variável: double *p.Ponteiros
soma(1), soma(1, 2, 3) com int soma(int a, int b)too few arguments to function ‘soma’; expected 2, have 1 / too many arguments…too few arguments to function call, expected 2, have 1 / too many…Passe exatamente os parâmetros que a função pede.Parâmetros
int area(int lado); e depois int area(double lado) {…}conflicting types for ‘area’; have ‘int(double)’ + note: previous declaration of ‘area’ with type ‘int(int)’conflicting types for 'area'O protótipo e a função não batem. Deixe os dois iguais.Protótipos
return n; numa função void; return; numa função int‘return’ with a value, in function returning void [-Wreturn-mismatch] / ‘return’ with no value, in function returning non-voidvoid function 'mostrar' should not return a value / non-void function 'calcular' should return a valueO return não combina com o tipo da função.Valor de Retorno
int total = 0; duas vezes no mesmo blocoredefinition of ‘total’redefinition of 'total'Declare uma vez só; depois, só atribua (total = 5;).Escopo
5 = x;lvalue required as left operand of assignmentexpression is not assignableÀ esquerda do = tem de haver um lugar para guardar (uma variável). Talvez você quisesse x = 5 ou x == 5.Atribuição
limite = 20; com const int limiteassignment of read-only variable ‘limite’cannot assign to variable 'limite' with const-qualified type 'const int'Uma constante não muda. Tire o const se ela precisa mudar.Constantes
break; dentro de um if, fora de laçobreak statement not within loop or switch'break' statement not in loop or switch statementbreak só sai de laços e de switch. Para sair de uma função, return.break e continue
dois case 1: no mesmo switchduplicate case valueduplicate case value '1'Cada case precisa de um valor diferente.switch
duas linhas num if sem chaves, depois else‘else’ without a previous ‘if’ (e antes, o aviso this ‘if’ clause does not guard...)expected expression (e o aviso misleading indentation)Sem chaves, o if só pega a primeira linha. Use sempre { }.if e else
p.x com struct ponto *p‘p’ is a pointer; did you mean to use ‘->’?member reference type 'struct ponto *' is a pointer; did you mean to use '->'?Com ponteiro, use p->x.Structs e Ponteiros
struct produto item; só com struct produto; declaradastorage size of ‘item’ isn’t knownvariable has incomplete type 'struct produto'A struct foi anunciada mas não definida (faltam os campos, ou falta o #include do .h que a define).Structs
nome + sobrenome com dois char *invalid operands to binary + (have ‘char *’ and ‘char *’)invalid operands to binary expression ('char *' and 'char *')Não se juntam strings com +. Use snprintf ou strcat.string.h
nota[0] com int notasubscripted value is neither array nor pointer nor vectorsubscripted value is not an array, pointer, or vectorOs colchetes só valem para arrays e ponteiros.Arrays
int v[n] = {0}; com n variávelvariable-sized object may not be initialized except with an empty initializervariable-sized object may not be initializedUm array de tamanho variável (VLA) só aceita = {} C23, ou um laço que zere.Arrays
#include <stdioh>fatal error: stdioh: Arquivo ou diretório inexistente + compilation terminated.fatal error: 'stdioh' file not foundO cabeçalho não existe: nome errado (aqui, faltou o .) ou biblioteca não instalada. Num .h seu, use aspas: #include "loja.h".Pré-processador
bool ok = true; com -std=c17unknown type name ‘bool’ + note: ‘bool’ is defined in header ‘<stdbool.h>’; this is probably fixable by adding ‘#include <stdbool.h>’use of undeclared identifier 'bool'Antes do C23, bool, true e false precisam de #include <stdbool.h> (e nullptr não existe). Com -std=c23, ou sem -std no gcc 15, funcionam direto.bool
"Não sei o que é": três jeitos de achar o erro
  1. Leia só a primeira mensagem error: e olhe a linha dela e a de cima.
  2. Copie o texto da mensagem (sem o nome do arquivo e os números) e procure nesta página ou na internet.
  3. Comente metade do código (/* … */) e compile de novo, até achar a linha culpada.

Avisos (warning)

Um aviso não impede o programa de ser criado, mas quase sempre aponta um bug. Compile sempre com -Wall -Wextra, e trate cada aviso como erro (a opção -Werror faz isso de verdade). Este programa junta os avisos mais comuns:

#include <stdio.h>

int maior(int a, int b) {
    if (a > b) {
        return a;
    }
}

int *criar(void) {
    int local = 7;
    return &local;
}

int main(int argc, char *argv[]) {
    int sobra;
    int x;
    printf("%d\n", x);
    x == 5;
    if (x > 5);
    {
        printf("maior\n");
    }
    int opcao = 1;
    switch (opcao) {
        case 1:
            printf("um\n");
        case 2:
            printf("dois\n");
            break;
    }
    if (x > 0)
        printf("a\n");
        printf("b\n");
    printf("%d %p\n", maior(1, 2), (void *)criar());
    return 0;
}
Códigogcc 15Clang (editor)O que significa e como consertarAula
int sobra; nunca usadaunused variable ‘sobra’ [-Wunused-variable]unused variable 'sobra' [-Wunused-variable]Sobrou do código antigo, ou você usou outro nome por engano. Apague.Avisos
printf("%d\n", x); sem valor em x‘x’ is used uninitialized [-Wuninitialized]variable 'x' is uninitialized when used here [-Wuninitialized]A variável tem lixo. Inicialize: int x = 0;.Variáveis
int main(int argc, char *argv[]) sem usá-losunused parameter ‘argc’ [-Wunused-parameter]unused parameter 'argc' [-Wunused-parameter]Se não usa, escreva int main(void).Argumentos
maior sem return no fimcontrol reaches end of non-void function [-Wreturn-type]non-void function does not return a value in all control paths [-Wreturn-type]Num dos caminhos, a função acaba sem devolver nada (e quem chamou recebe lixo). Ponha um return no fim.Valor de Retorno
return &local;function returns address of local variable [-Wreturn-local-addr]address of stack memory associated with local variable 'local' returned [-Wreturn-stack-address]A variável local some quando a função termina; o endereço fica apontando para o nada. Use malloc ou receba um ponteiro de quem chama.Pilha e Heap
x == 5; sozinhostatement with no effect [-Wunused-value]equality comparison result unused [-Wunused-comparison] + note: use '=' to turn this equality comparison into an assignmentVocê quis x = 5;.Comparação
if (x > 5);suggest braces around empty body in an ‘if’ statement [-Wempty-body]if statement has empty body [-Wempty-body]O ; logo depois do if é o corpo dele (vazio): o bloco de baixo roda sempre. Tire o ;.if e else
case 1: sem breakthis statement may fall through [-Wimplicit-fallthrough=](nenhum aviso)O case 1 continua no case 2 e mostra um e dois. Ponha break;, ou [[fallthrough]]; C23 se for de propósito.switch
duas linhas indentadas sob um if sem chavesthis ‘if’ clause does not guard... [-Wmisleading-indentation]misleading indentation; statement is not part of the previous 'if' [-Wmisleading-indentation]A segunda linha não está dentro do if, apesar do recuo. Use chaves.if e else
printf("%d", preco) com doubleformat ‘%d’ expects argument of type ‘int’, but argument 2 has type ‘double’ [-Wformat=]format specifies type 'int' but the argument has type 'double' [-Wformat]Formato e valor não combinam. Tabela completa: printf e scanf.Formatos
if (idade = 18)suggest parentheses around assignment used as truth value [-Wparentheses]using the result of an assignment as a condition without parenthesesComparar é ==. Mais armadilhas de operadores: Operadores.Comparação
i < strlen(s) com int icomparison of integer expressions of different signedness: ‘int’ and ‘size_t’ {aka ‘long unsigned int’} [-Wsign-compare](nenhum aviso)int × sem sinal: um negativo vira um número enorme. Use size_t i. Veja Tipos e Limites.Conversão
free(v); free(v);pointer ‘v’ used after ‘free’ [-Wuse-after-free](nenhum aviso)Depois do free, o ponteiro não vale mais. Faça v = NULL; logo depois.malloc e free
uma função que chama a si mesma sempreinfinite recursion detected [-Winfinite-recursion]all paths through this function will call itself [-Winfinite-recursion]Falta o caso base (o if que para a recursão).Recursão

Erros de ligação (o ld)

O compilador transforma cada .c num arquivo-objeto (.o); o ligador junta tudo, com as bibliotecas, num executável. Os erros dele não têm número de linha e terminam sempre com collect2: error: ld returned 1 exit status ("o ld terminou com o código 1"). Aula: Como o C Vira Programa.

$ gcc -std=c23 -Wall -Wextra l01.c -o l01               « l01.c declara int soma(int a, int b); mas não a define
/usr/bin/x86_64-linux-gnu-ld.bfd: /tmp/ccOoraNE.o: na função "main":
l01.c:(.text+0x13): referência não definida para "soma"
collect2: error: ld returned 1 exit status
$ gcc -std=c23 -Wall -Wextra l02.c -o l02               « escreveu int Main(void)
/usr/bin/x86_64-linux-gnu-ld.bfd: /usr/lib/gcc/x86_64-linux-gnu/15/../../../x86_64-linux-gnu/Scrt1.o: na função "_start":
(.text+0x1b): referência não definida para "main"
collect2: error: ld returned 1 exit status
$ gcc -std=c23 -Wall -Wextra l03.c -o l03               « usa sqrt(x) do math.h
/usr/bin/x86_64-linux-gnu-ld.bfd: /tmp/ccezM8a9.o: na função "main":
l03.c:(.text+0x23): referência não definida para "sqrt"
collect2: error: ld returned 1 exit status
$ gcc -std=c23 -Wall -Wextra l03.c -o l03 -lm
$ ./l03
1.414
$ gcc -std=c23 -Wall -Wextra l04a.c l04b.c -o l04       « os dois arquivos têm int contador = 0;
/usr/bin/x86_64-linux-gnu-ld.bfd: /tmp/ccWgCA1M.o:(.bss+0x0): múltiplas definições de "contador"; /tmp/cc7vaz22.o:(.bss+0x0): definido primeiro aqui
collect2: error: ld returned 1 exit status
$ gcc -std=c23 -Wall -Wextra l01.c -o l01 -lfoo
/usr/bin/x86_64-linux-gnu-ld.bfd: não foi possível localizar -lfoo: Arquivo ou diretório inexistente
collect2: error: ld returned 1 exit status
Mensagem do ld (português / inglês)No editorO que significa e como consertarAula
referência não definida para "soma"
undefined reference to `soma'
wasm-ld: error: …: undefined symbol: soma + clang: error: linker command failed with exit code 1A função foi declarada (protótipo) mas ninguém a escreveu, ou o .c que a tem não entrou no comando. Escreva a função ou ponha todos os .c: gcc main.c loja.c -o loja.Vários Arquivos
referência não definida para "main"compila, e o programa cai com Falha de segmentação (139)Não há função main: nome errado (Main, mian) ou o arquivo certo não entrou no comando.Olá, Mundo
referência não definida para "sqrt"funciona (o editor não precisa de -lm)As funções do math.h ficam na biblioteca libm: acrescente -lm no fim do comando.Matemática
múltiplas definições de "contador"; … definido primeiro aqui
multiple definition of `contador'
wasm-ld: error: duplicate symbol: contadorDois .c definem a mesma variável global (ou função). Defina em um só; no outro, e no .h, declare com extern int contador;.static e extern
não foi possível localizar -lfoo
cannot find -lfoo
—A biblioteca libfoo não está instalada, ou o nome está errado. Instale o pacote de desenvolvimento dela (libfoo-dev) ou indique a pasta com -L.Bibliotecas

Outras mensagens do gcc

$ gcc -std=c23 -Wall -Wextra nao-existe.c -o x
cc1: fatal error: nao-existe.c: Arquivo ou diretório inexistente
compilation terminated.
$ gcc
gcc: fatal error: no input files
compilation terminated.

O arquivo não está nesta pasta (confira com ls e pwd) ou o nome está errado; e o gcc precisa de pelo menos um arquivo. Aula: Compilar com gcc.

Erros do terminal (o bash)

$ ./e01                                                  « o e01.c tinha erro: o programa não foi criado
bash: ./e01: Arquivo ou diretório inexistente
$ ./l03                                                  « o arquivo perdeu a permissão de execução
bash: ./l03: Permissão negada
$ ola                                                    « faltou o ./
bash: ola: comando não encontrado
Mensagem (português / inglês)O que significa e como consertarAula
Arquivo ou diretório inexistente
No such file or directory
O programa não existe: a compilação falhou (role para cima e leia o erro) ou o nome depois do -o é outro.Compilar
Permissão negada
Permission denied
O arquivo não é executável: você tentou rodar o .c (./ola.c) em vez do programa, ou ele perdeu a permissão (chmod +x programa).Compilar
comando não encontrado
command not found
Para rodar um programa da pasta atual, escreva ./ antes: ./ola. Se for o próprio gcc, ele não está instalado.Instalar no Linux

Erros de execução

O programa compilou, começou a rodar e caiu. Aqui, a mensagem vem do sistema ou da biblioteca C, sem número de linha. Para achar a linha, use o gdb, os sanitizers (-fsanitize=address) ou o Valgrind. As saídas abaixo são do terminal da Ana (-t, terminal de verdade):

$ ./r1                                                   « int *p = NULL; *p = 5;
Vou escrever no endereço nulo...
Falha de segmentação     (imagem do núcleo gravada) ./r1
$ echo "código: $?"
código: 139
$ ./r3                                                   « assert(estoque >= 0); com estoque = -2
r3: r3.c:6: main: Assertion `estoque >= 0' failed.
Abortado                   (imagem do núcleo gravada) ./r3
$ ./r4                                                   « free(v); free(v);
free(): double free detected in tcache 2
Abortado                   (imagem do núcleo gravada) ./r4
$ ./r6                                                   « free num array que não veio do malloc
free(): invalid pointer
Abortado                   (imagem do núcleo gravada) ./r6
$ ./r7                                                   « recursão sem fim
Falha de segmentação     (imagem do núcleo gravada) ./r7
$ echo AnaSouzaDaSilva | ./r5                            « scanf("%s", nome) num char nome[8]
Nome: Olá, AnaSouzaDaSilva!
*** stack smashing detected ***: terminated
Abortado                   (imagem do núcleo gravada) echo AnaSouzaDaSilva | ./r5
Mensagem (português / inglês)Causas comunsNo editorComo consertarAula
Falha de segmentação (imagem do núcleo gravada)
Segmentation fault (core dumped)
usar um ponteiro NULL (um fopen ou malloc sem teste); scanf sem &; mudar uma string literal; printf("%s") com um número; recursão sem fim (estouro da pilha)a mesma mensagem e 139 no ponteiro nulo e na recursão; muitos dos outros casos passam caladosteste os NULL; leia os avisos do -Wall; rode no gdb para ver a linhaPonteiro Nulo
Exceção de ponto flutuante (imagem do núcleo gravada)
Floating point exception
divisão (ou %) de inteiros por zero, apesar do nomeigual (136)if (divisor != 0) antes da contaAritméticos
Assertion `estoque >= 0' failed. + Abortado
Aborted
um assert cuja condição deu falsa: é o seu programa avisando que algo "impossível" aconteceuAssertion failed: estoque >= 0 (r3.c: main: 6) + Abortado (134)descubra por que a condição ficou falsa (a mensagem diz o arquivo, a função e a linha)Testes (assert)
free(): double free detected in tcache 2 + Abortadofree duas vezes no mesmo ponteiropassa calado (o programa termina normalmente)free(v); v = NULL;malloc e free
free(): invalid pointer + Abortadofree num endereço que não veio do malloc (um array comum, ou o meio de um bloco)passa caladosó dê free no que veio de malloc/calloc/reallocmalloc e free
*** stack smashing detected ***: terminated + Abortadoescrever além do fim de um array local: scanf("%s") sem largura, strcpy, gets, laço que passa do fim. O gcc percebe na saída da função (repare que o Olá saiu antes)passa calado (mostra Olá, AnaSouzaDaSilva! e termina com 0)sempre com tamanho: %7s, fgets, snprintfSegurança
o programa "trava" e não terminalaço infinito; scanf esperando a entrada; laço com scanf que não confere o retornopara em 15 sCtrl+C para interromper; confira a condição do laçowhile
No editor, muitos erros de memória passam calados

O WebAssembly organiza a memória de outro jeito: o free duplo, o free inválido, o estouro de array e a escrita numa string literal não derrubam o programa no editor. Isso não quer dizer que o código esteja certo: no Linux, os mesmos programas caem. Para ver esses erros de verdade, compile no seu computador com -fsanitize=address (aula Sanitizers).

Códigos de saída

Todo programa termina com um número, que o terminal guarda em $? (echo $? mostra) e que o editor mostra como [código de saída: N]. Acima de 128, é 128 + o número do sinal que matou o programa. Aula: exit e atexit.

CódigoQuer dizerExemplo realAula
0deu certoreturn 0;, exit(EXIT_SUCCESS)exit
1 (ou outro de 1 a 125)o programa avisou que deu erradoreturn 1;, exit(EXIT_FAILURE); o próprio gcc termina com 1 quando a compilação falhaexit
126o bash achou o arquivo mas não pôde executá-loPermissão negadaCompilar
127o bash não achou o comandocomando não encontradoCompilar
130128 + 2 (SIGINT): interrompido com Ctrl+Cum laço infinito interrompidoSinais
134128 + 6 (SIGABRT): Abortadoabort(), assert falho, double free, stack smashingSinais
136128 + 8 (SIGFPE): Exceção de ponto flutuantedivisão inteira por zeroSinais
139128 + 11 (SIGSEGV): Falha de segmentaçãoponteiro nulo, recursão sem fimSinais
143128 + 15 (SIGTERM): Terminadokill no programa, ou raise(SIGTERM)Sinais

Experimente

Missão: a Ana escreveu a conta da papelaria com pressa, e o programa nem compila. Clique em Rodar, leia a primeira mensagem de erro, conserte, rode de novo, e repita até sair Total: R$ 30, sem nenhum aviso. (São três erros; use as tabelas desta página.)

#include <stdio.h>

int main(void) {
    int canetas = 3
    int cadernos = 2;
    int total = canetas * 4 + cadernos * 9;
    printf("Total: R$ %d\n", totl);
    return 0;
}
#include <stdio.h>

int main(void) {
    int canetas = 3;
    int cadernos = 2;
    int total = canetas * 4 + cadernos * 9;
    printf("Total: R$ %d\n", total);
    return 0;
}

Resumo

  • Compilação (arquivo:linha:coluna: error:): conserte o primeiro erro primeiro e olhe também a linha de cima. Os mais comuns: undeclared, expected ‘;’, implicit declaration, aspas e chaves sem par.
  • Avisos (warning:): quase sempre são bugs. Compile com -Wall -Wextra e deixe zero avisos.
  • Ligação (referência não definida para, collect2: error: ld returned 1 exit status): falta uma função, o main, um .c no comando ou o -lm.
  • Execução: Falha de segmentação (139), Abortado (134: assert, double free, stack smashing), Exceção de ponto flutuante (136). Ache a linha com gdb ou -fsanitize=address.
  • No editor, as mensagens são do Clang, e muitos erros de memória passam calados: confira no gcc.