Pular para o conteúdo principal

Questão de Programação — Linguagens de programação — FUNDATEC 2026

ProgramaçãoLinguagens de programação
Código
qg685308
Banca
FUNDATEC
Órgão
IFC-SC
Ano
2026
Nível
Superior
Cargo
Professor EBTT - Informática: Programação Básica e Programação Web
Sobre a alocação dinâmica em C, se um programador executar p = malloc(10 * sizeof(int)) e, logo após, sem liberar a memória, executar p = malloc(5 * sizeof(int)), o que ocorre tecnicamente no sistema?
  1. AO primeiro bloco é automaticamente liberado pelo SO (Garbage Collection).
  2. BOcorre um vazamento de memória (Memory Leak), pois o endereço do primeiro bloco foi perdido.
  3. CO segundo malloc falhará, pois o ponteiro p já está ocupado.
  4. DO tamanho do bloco original é redimensionado para 5 inteiros.
  5. EO ponteiro p passará a apontar para uma área de memória contendo os dois blocos.
Revelar gabarito e comentário

GabaritoB — Ocorre um vazamento de memória (Memory Leak), pois o endereço do primeiro bloco foi perdido.

Comentário gerado por IA. É um apoio ao estudo, ancorado em fontes, mas pode conter imprecisões — confira sempre na fonte oficial (lei, súmula, edital e gabarito da banca). Encontrou um erro? Use “Reportar”.

Alocação dinâmica em C: memory leak

Gabarito: letra B. Quando um programador executa p = malloc(10 * sizeof(int)) e logo depois, sem liberar a memória, executa p = malloc(5 * sizeof(int)), o endereço do primeiro bloco é perdido, impossibilitando sua liberação. Isso caracteriza um vazamento de memória (memory leak), pois a memória alocada anteriormente permanece ocupada, mas não é mais acessível. Em C, não há garbage collection automática; o programador deve usar free() para cada malloc().

A banca testa o conhecimento sobre gerenciamento manual de memória em C. O erro comum é pensar que o sistema operacional cuida da liberação ou que reatribuir o ponteiro é proibido.

  1. 1malloc(10*sizeof(int))Bloco A alocado
  2. 2p = malloc(5*sizeof(int))Endereço de A perdido
  3. 3free() impossível em AMemory leak
LEVEL · soulevel.com.br

Alternativa A — ❌ Incorreta

Afirma que o primeiro bloco é automaticamente liberado pelo SO (Garbage Collection). Isso é falso: C não possui coletor de lixo. A memória deve ser explicitamente liberada por free(). Sobrescrever o ponteiro sem liberar o bloco anterior causa vazamento, não liberação.

Alternativa B — ✅ Correta ⟵ GABARITO

O endereço do primeiro bloco foi perdido quando p recebeu o novo endereço do segundo malloc. Não é mais possível chamar free() no bloco original, caracterizando um vazamento de memória (memory leak). O bloco permanece alocado até o término do programa, consumindo recursos desnecessariamente.

Alternativa C — ❌ Incorreta

Diz que o segundo malloc falhará porque o ponteiro p já está ocupado. O ponteiro é apenas uma variável que armazena um endereço; pode ser reatribuído. malloc sempre retorna um novo endereço (ou NULL em falha), independentemente do valor anterior do ponteiro. Não há impedimento.

Alternativa D — ❌ Incorreta

Afirma que o bloco original é redimensionado para 5 inteiros. Não há redimensionamento automático. O primeiro bloco continua com 10 inteiros alocados, mas perdeu a referência. O segundo malloc cria um bloco novo e totalmente separado.

Alternativa E — ❌ Incorreta

Sugere que p passará a apontar para uma área de memória contendo os dois blocos. Isso não ocorre: p aponta exclusivamente para o segundo bloco. O primeiro bloco fica órfão, sem qualquer ponteiro que o referencie.

NÃO CAIA NESSA!

A alternativa A pode enganar quem vem de linguagens com garbage collection (Java, Python). Em C, o programador é o único responsável pela liberação. A alternativa C confunde: o ponteiro não é um recurso exclusivo; pode ser reatribuído a qualquer momento. Lembre-se: malloc sempre aloca um novo bloco; perder o ponteiro anterior = vazamento.

Gabarito: letra B — memory leak.

Link permanente: /questoes/qg685308