Questão de Programação — Linguagens de programação — FUNDATEC 2026
Programação›Linguagens 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?
AO primeiro bloco é automaticamente liberado pelo SO (Garbage Collection).
BOcorre um vazamento de memória (Memory Leak), pois o endereço do primeiro bloco foi perdido.
CO segundo malloc falhará, pois o ponteiro p já está ocupado.
DO tamanho do bloco original é redimensionado para 5 inteiros.
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.
1malloc(10*sizeof(int))Bloco A alocado
2p = malloc(5*sizeof(int))Endereço de A perdido
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.