Ir ao conteúdo
  • Cadastre-se

C Realocar capacidade de um vetor


Ir à solução Resolvido por arfneto,

Posts recomendados

@arfneto Li seu tópico sobre alocação de memória (que o sistema operacional limpa ela antes de executar seu programa) e me veio um dúvida meio aleatória. Partindo do princípio de que (até onde eu sei) os vetores são ponteiros, teria uma maneira de realocar o espaço de um vetor para deixá-lo mais adequado às necessidades atuais?

 

Por exemplo, declarei um vetor para comportar 2 elementos, mas depois vi que precisava comportar mais (exemplo 4). Teria um jeito de eu aumentar a capacidade desse vetor?

 

Eu fiz um pequeno código de teste e parece que eu funcionou, mas não sei se é uma técnica válida:

#include <stdio.h>
#include <stdlib.h>

int main() {
    int *vetor = NULL;

    // Abrir espaco para um valor
    vetor = realloc(vetor, sizeof(int));
    vetor[0] = 1;

    // Abrir espaco para mais um valor
    vetor = realloc(vetor, 2 * sizeof(int));
    vetor[1] = 2;
    
    return EXIT_SUCCESS;
}

 

Link para o comentário
Compartilhar em outros sites

  • Solução
54 minutos atrás, AdrianoSiqueira disse:

(que o sistema operacional limpa ela antes de executar seu programa)

 

Sim. E pode não "limpar" durante a execução de seu programa, como eu te disse. E isso é bom. 

Não é que as variáveis sejam inicializadas. É apenas um efeito colateral de uma política de segurança para evitar a injeção de código malicioso. Não conte com isso.

 

56 minutos atrás, AdrianoSiqueira disse:

Eu fiz um pequeno código de teste e parece que eu funcionou, mas não sei se é uma técnica válida

 

Você entendeu perfeitamente. A técnica é válida e realloc() foi escrita para isso: aumentar ou DIMINUIR a área alocada. Mas quase não se usa. É uma rotina um tanto odiada.

 

Para diminuir está bem. 

 

O problema é quando aumenta o tamanho da área alocada: A razão é a mesma de não ser esperto inicializar a memória alocada: controle. E custo. 

 

Eis o que acontece:

 

A primeira coisa que realloc() faz é comparar o tamanho atual e o solicitado. Se vai diminuir a área correspondente é liberada, contadores internos são reajustados e pronto.

 

Mas se vai aumentar nada garante que vai ser usado o mesmo endereço inicial. E provavelmente não vai. Isso quer dizer que realloc() vai copiar todo o conteúdo já existente para uma nova área com o novo tamanho. 

 

Antes que você pergunte: nada pode ser assumido em relação ao conteúdo da parte nova da área. O original vai estar lá, igualzinho. Garantido. A parte nova vai estar lá do jeito que foi entregue pelo sistema. 

 

Mas copiar tudo de um lugar pro outro pode demorar muito e pode acontecer numa hora errada. Se seu programa está fazendo outras coisas, ou mesmo o sistema como um todo, pode acontecer desse atraso na cópia ser um problema e você não tem como controlar: pode mudar os tempos de resposta e atrasar algo importante.

 

Por isso em geral se usam outras técnicas, como páginas de alocação, um mapa onde você aloca em unidades grandes uma por vez. Ou estruturas dinâmicas onde você aloca um a um mesmo, como listas ou árvores.

  • Amei 1
Link para o comentário
Compartilhar em outros sites

Crie uma conta ou entre para comentar

Você precisa ser um usuário para fazer um comentário

Criar uma conta

Crie uma nova conta em nossa comunidade. É fácil!

Crie uma nova conta

Entrar

Já tem uma conta? Faça o login.

Entrar agora

Sobre o Clube do Hardware

No ar desde 1996, o Clube do Hardware é uma das maiores, mais antigas e mais respeitadas comunidades sobre tecnologia do Brasil. Leia mais

Direitos autorais

Não permitimos a cópia ou reprodução do conteúdo do nosso site, fórum, newsletters e redes sociais, mesmo citando-se a fonte. Leia mais

×
×
  • Criar novo...

 

GRÁTIS: ebook Redes Wi-Fi – 2ª Edição

EBOOK GRÁTIS!

CLIQUE AQUI E BAIXE AGORA MESMO!