Carregando...
Carregando...
Ajude a melhorar a plataforma
Um desenvolvedor está criando um sistema de gerenciamento de biblioteca em linguagem C. Para organizar as informações sobre os livros, ele decide utilizar estruturas e typedef. Ele quer definir um tipo para os livros que inclui título, autor, ano de publicação e número de páginas. Além disso, ele precisa de uma função para atualizar o ano de publicação de um livro.
Analise o seguinte cenário:
A biblioteca utiliza um sistema em C que gerencia os dados dos livros através de uma estrutura Book. A estrutura contém os seguintes campos: título (char[100]), autor (char[50]), ano de publicação (int) e número de páginas (int). A função updateYear atualiza o ano de publicação de um livro.
Baseado neste cenário, identifique as afirmativas corretas sobre a implementação e a utilização da função updateYear:
Está correto o que se afirma em:
Explique melhor esta questão
Abre o Tutor com o enunciado e as alternativas já no campo — você revisa e envia.
Esta questão foi verificada por um de nossos administradores.
Alternativa (E) - I, apenas.
A questão aborda um cenário comum no desenvolvimento em C: como manipular e atualizar dados de estruturas (structs) dentro de funções. O uso correto de ponteiros para passar estruturas é fundamental para garantir que as alterações feitas dentro da função sejam refletidas na estrutura original no escopo de chamada, evitando cópias desnecessárias e garantindo a integridade dos dados.
Em linguagem C, quando passamos variáveis para funções, existem duas abordagens principais:
int, char), isso é comum. Para estruturas grandes, a cópia pode ser ineficiente.No contexto de atualizar um campo de uma estrutura Book em C, o objetivo é modificar a instância específica do livro, e não uma cópia dele.
Vamos analisar cada afirmativa:
| Afirmativa | Descrição | Análise | Correta? |
| :--------- | :-------- | :------ | :------- |
| 1. | "A função updateYear deve receber um ponteiro para Book e o novo ano, e deve atualizar diretamente o campo ano de publicação." | Esta é a maneira correta e idiomática em C de modificar uma estrutura existente. Ao receber um ponteiro (struct Book *bookPtr), a função pode acessar e modificar o campo ano_publicacao da estrutura original usando o operador ->. Exemplo: void updateYear(struct Book *bookPtr, int newYear) { bookPtr->ano_publicacao = newYear; }. | SIM |
| 2. | "A função updateYear deve receber uma cópia da estrutura Book e o novo ano, atualizar a cópia e retornar a estrutura atualizada." | Ao receber uma cópia (struct Book bookCopy), a função atualiza apenas a cópia local. Embora seja possível retornar a cópia modificada (return bookCopy;) e o chamador atribuir myBook = updateYear(myBook, 2024);, isso envolve copiar a estrutura duas vezes (na entrada e na saída da função), o que é ineficiente para estruturas grandes e não modifica a estrutura "no lugar" como a passagem por ponteiro. Não é a forma mais direta de "atualizar" o objeto original. | NÃO |
| 3. | "A função updateYear deve receber um ponteiro para Book e o novo ano, criar uma nova estrutura Book com o novo ano e retornar essa nova estrutura." | Esta afirmativa descreve a criação de um novo objeto Book, não a atualização do objeto existente passado como ponteiro. Se a nova estrutura for criada na pilha da função e seu endereço for retornado, resultaria em um ponteiro pendente (dangling pointer) após a função retornar. Se for criada dinamicamente na heap, exigiria gerenciamento de memória pelo chamador. De qualquer forma, não é o objetivo de "atualizar" o livro original. | NÃO |
| 4. | "A função updateYear deve receber o título do livro e o novo ano, e deve procurar o livro pelo título e atualizar o ano de publicação." | Esta opção descreve uma função que operaria sobre uma coleção de livros (por exemplo, um array ou lista encadeada), onde a função primeiro procuraria o livro e depois o atualizaria. A questão foca na manipulação de um único objeto Book e sua função de atualização, não em operações de busca ou gerenciamento de uma biblioteca inteira. É um nível de abstração diferente. | NÃO |
| 5. | "A função updateYear deve receber uma cópia da estrutura Book e o novo ano, e deve retornar um ponteiro para a estrutura atualizada." | Receber uma cópia (struct Book bookCopy) significa que a bookCopy é uma variável local da função. Retornar um ponteiro para esta variável local (return &bookCopy;) resultaria em um erro grave (ponteiro pendente), pois a memória da bookCopy é liberada quando a função termina. O ponteiro retornando apontaria para uma área de memória inválida. | NÃO |
A maneira mais eficiente, segura e idiomática em C para atualizar campos de uma estrutura existente dentro de uma função é passar um ponteiro para essa estrutura. Isso permite que a função modifique diretamente a memória da estrutura original, garantindo que as alterações sejam persistidas e evitando cópias desnecessárias de dados. A afirmativa 1 descreve precisamente essa abordagem.
Alternativa (E).