How to keep the vector values ​​stored?

Question:

I'm a beginner in C and I've been doing this exercise for 2 days, I managed to do it so that if you increase the vector with the realloc function, it will increase all right, but I need it to keep the values ​​you typed.

For example, I want a 2 position vector, and then I'm going to reallocate it with + 3 positions, it shouldn't ask to input all the vector values ​​again but enable to input values ​​ONLY for these 3 new positions.

How to make it save what was already stored in the vector?

I was unable to store the values ​​that the user types the first time when the vector is allocated and then only fill in by reallocating the values ​​of the NEW POSITIONS , that is, let the user fill in new values ​​only in these new positions and KEEP THE NUMBERS TYPED PREVIOUSLY

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



int main(void)
{
    int *p;
    int i,k,n;
    printf ("\nDigite a quantidade de numeros que serao digitados: ");
    fflush(stdin);
    scanf ("%d",&i); // a variavel i vai receber a quantidade de numeros que sera necessario para o vetor

    /* a função malloc reserva espaço suficiente para um vetor de inteiros.
    caso sejam digitados 5 elementos serão reservados 20 bytes, pois cada
    inteiro ocupa 4 bytes na memória */

    p=(int*)malloc(i*sizeof(int)); // Aloca um espaço de memoria para um vetor de inteiros
    if (p==NULL) // verifica se ha memoria disponivel ANTES de habilitar para preencher vetor
    {
        printf ("\nERRO.MEMORIA INSUFICIENTE");
        exit(1);
    }
    for (k=0;k<i;k++) // preenche o vetor
    {
        printf ("\nDigite o %d numero do vetor: ",k+1);
        fflush(stdin); //limpar buffer do teclado
        scanf ("%d",&p[k]);
    }
    printf ("\n\n\t\t========== VETOR PREENCHIDO ==========\n");
    for (k=0;k<i;k++) // Mostra vetor preenchido
    {
        printf ("\t\t%d",p[k]);
    }

      printf ("\n\nSeu vetor possui %d elementos.",i);
      printf ("\nDigite um valor positivo para aumentar ao vetor.");
      printf ("\n\n");
      fflush(stdin);
      scanf ("%d",&n); // n vai receber a quantidade de posicoes que tera de ser realocado o vetor para inserção de novos numeros

      if ((i+n)<0) // Testa para ver se o usuario vai digitar um valor positivo para aumentar o vetor dinamicamente
      {
          printf ("\nSeu vetor possui quantidade negativa de elemento.\n\nIMPOSSIVEL ALOCAR MEMORIA.\n\n");
          free(p);
          return 0;
          system("pause");
      }

      /* a função realloc aumenta (numero positivo) ou diminui (numero negativo), o tamanho do
      vetor dinamicamente. ela recebe o ponteiro para o vetor anterior e retorna o novo espaço alocado */

      p=(int*)(realloc(p,(i+n)*sizeof(int))); // REaloca um espaço de memoria para a quantidade informada
      if (p==NULL) //Testa novamente mas agora para saber se ha espaço disponivel para a REalocacao
      {
          printf ("\nERRO DE REALOCACAO.MEMORIA INSUFICIENTE");
          exit(1);
      }
      for (k=0;k<(n+i);k++) // Aceita preencher com os novos valores do vetor aumentado dinamicamente
      {
          printf ("\nDigite o %d numero do vetor: ",k+1);
          fflush(stdin);
          scanf ("%d",&p[k]);
      }
      printf ("\n\n\t\t========== VETOR PREENCHIDO REALOCADO ==========\n");
      for (k=0;k<(n+i);k++) // Mostra vetor REalocado
      {
           printf ("\t\t%d",p[k]);
      }
      free(p); // Libera o espaço de memoria que utilizamos
      return 0;
      system("pause");
  }

Answer:

I improved the readability of the code and modernized it, but the error is actually taking the positions of the new array . It is starting at position 0 that has already been filled, it has to start where it left off in the old one, since the new one has 5 positions, it has to fill 4 and 5 and not 0 and 1 as is happening. Look for the i in place of the 0. This is often difficult to spot due to the lack of readability.

for (int k = i; k < (n + i); k++) {

Look:

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

int main(void) {
    int i;
    printf("\nDigite a quantidade de numeros que serao digitados: ");
    scanf ("%d", &i);
    int *p = malloc(i * sizeof(int));
    if (p == NULL) {
        printf ("\nERRO.MEMORIA INSUFICIENTE");
        exit(1);
    }
    for (int k = 0; k < i; k++) {
        printf ("\nDigite o % do valor do vetor: ", k + 1);
        scanf ("%d", &p[k]);
    }
    printf("\n\n========== VETOR PREENCHIDO ==========\n");
    for (int k = 0; k < i; k++) printf ("%d\t", p[k]);
    printf("\n\nSeu vetor possui %d elementos.", i);
    printf("\nDigite um valor positivo para aumentar ao vetor.");
    printf("\nDigite um valor negativo para diminuir do vetor.\n\n");
    int n;
    scanf("%d", &n);
    if (!(i + n)) {
        printf("\nSeu vetor possui 0 elementos.\n\n");
        exit(1);
    } else if ((i + n) < 0) {
        printf("\nSeu vetor possui quantidade negativa de elemento.\n\nIMPOSSIVEL ALOCAR MEMORIA.\n\n");
        exit(1);
    }
    p = realloc(p, (i + n) * sizeof(int));
    if (p == NULL) {
        printf("\nERRO DE RE-ALOCACAO.MEMORIA INSUFICIENTE");
        exit(1);
    }
    for (int k = i; k < (n + i); k++) { //<==================== o erro estava aqui
        printf("\nDigite o % do valor do vetor: ",k+1);
        scanf("%d", &p[k]);
    }
    printf("\n\n========== VETOR PREENCHIDO REALOCADO ==========\n");
    for (int k = 0; k < (n+i); k++) {
        printf("%d\t", p[k]);
    }
    free(p); //na prática não é necessário aqui porque o programa vai encerrar, mas pra fins de aprendizado ok
}

See working on ideone . And on repl.it. Also posted on GitHub for future reference .

Scroll to Top