Colocar NULL depois de realloc

8 respostas
rodrigo.bossini

Oi pessoal,

Tenho um vetor que de vez em quando preciso fazer crescer de tamanho. Para isto estou usando realloc.

Meu problema é o seguinte:

Digamos que eu tenha um vetor com uma única posição, preenchida. Neste momento preciso adicionar um outro objeto, mas quero adicioná-lo na posição 14 do vetor.
Então eu dou um realloc para o vetor ter 15 posições válidas (de 0 a 14) e adiciono o objeto na posição 14, como queria. Mas depois disso eu gostaria que todas as posições
que não tinham um objeto válido sejam preenchidas com NULL. Alguma dica pra solucionar esse problema?

8 Respostas

pmlm

Se criares um vetor com 15 posições e só settares valor na posição 14, todas as outras ficam a NULL…

matheuslmota

Você pode usar a função memset. Essa função preenche um bloco de bytes com um determinado valor. No seu caso, faça mais ou menos assim:

char vetor[1] = 'a';
char auxiliar = malloc(15*sizeof(char));
memset(auxiliar, 0, sizeof(auxiliar));/* Essa função recebe um ponteiro para o bloco de memória que você quer setar (no caso, o nome de um vetor é um ponteiro para o primeiro elemento deste vetor), o valor que você quer colocar em cada posição de memória e o tamanho do bloco a ser mudado*/
auxiliar[0] = vetor[0];
auxiliar[10] = 'b';// Você agora tem um vetor com um caracter na posição 0 e outro na posição 10

Isso talvez lhe ajude com seu problema.

rodrigo.bossini

matheuslmota:
Você pode usar a função memset. Essa função preenche um bloco de bytes com um determinado valor. No seu caso, faça mais ou menos assim:

char vetor[1] = 'a';
char auxiliar = malloc(15*sizeof(char));
memset(auxiliar, 0, sizeof(auxiliar));/* Essa função recebe um ponteiro para o bloco de memória que você quer setar (no caso, o nome de um vetor é um ponteiro para o primeiro elemento deste vetor), o valor que você quer colocar em cada posição de memória e o tamanho do bloco a ser mudado*/
auxiliar[0] = vetor[0];
auxiliar[10] = 'b';// Você agora tem um vetor com um caracter na posição 0 e outro na posição 10

Isso talvez lhe ajude com seu problema.

Então, nesse seu exemplo eu preciso saber quais as posições têm um objeto válido pra que depois de usar o memset eu possa copiá-las para o novo vetor, certo?
Isso não ajuda muito porque o problema continua o mesmo: como determinar quais posições têm um objeto válido?

matheuslmota

rod.attack:
matheuslmota:
Você pode usar a função memset. Essa função preenche um bloco de bytes com um determinado valor. No seu caso, faça mais ou menos assim:

char vetor[1] = 'a';
char auxiliar = malloc(15*sizeof(char));
memset(auxiliar, 0, sizeof(auxiliar));/* Essa função recebe um ponteiro para o bloco de memória que você quer setar (no caso, o nome de um vetor é um ponteiro para o primeiro elemento deste vetor), o valor que você quer colocar em cada posição de memória e o tamanho do bloco a ser mudado*/
auxiliar[0] = vetor[0];
auxiliar[10] = 'b';// Você agora tem um vetor com um caracter na posição 0 e outro na posição 10

Isso talvez lhe ajude com seu problema.

Então, nesse seu exemplo eu preciso saber quais as posições têm um objeto válido pra que depois de usar o memset eu possa copiá-las para o novo vetor, certo?
Isso não ajuda muito porque o problema continua o mesmo: como determinar quais posições têm um objeto válido?

Você não informou que o vetor a ser redimensionado poderia ter posições nulas. Se for esse problema, você pode verificar se uma posição é nula antes de adicionar:

int indexVetorNovo = 0;
for(i=0;i<tamanhoInicialDoVetor;i++) 
   if(vetorInicial[i]!=NULL)
   {
      vetorNovo[indexVetorNovo]=vetorInicial[i];
      indexVetorNovo++;
   }

Isso garante que você não irá deixar expaços em branco no novo vetor. Você pode adicionar isso ao meu código anterior.
[]'s

ViniGodoy

Movido para o fórum de outras linguagens.

ViniGodoy

Você vai usar C ou C++?

rodrigo.bossini

Precisa ser em C.

matheuslmota

Mas e ai? Qual a sua dúvida? O que eu lhe disse ajudou em algo?

Criado 11 de junho de 2011
Ultima resposta 11 de jun. de 2011
Respostas 8
Participantes 4