How to duplicate a struct in "C"

Asked

Viewed 38 times

-3

I have an activity that is to create a struct with SIZE = 5 initially, but I would like it to double its value if it is necessary to insert a sixth value, created a return function for this but the same is with error that I can not identify.

#include <stdio.h>
int SIZE = 5;


struct Lista
{
    int tamanho;
    int* elementos;
};

typedef struct Lista  ArrayList;

/*
Operações

*/

//dobra capacidade
int  dobrarCapacidade( ArrayList* ArrayList)
{
    SIZE = SIZE * SIZE ; //duplicando a capacidade
    int* novo = malloc (sizeof(SIZE));// Arranjo temporario
    int i;
    for(i = 0; i <=  ArrayList->tamanho; i++)
    {
        novo[i] =  ArrayList->elementos[i];
    }
    free( ArrayList->tamanho);
     ArrayList->elementos = novo;
}


//iseri valor em lista
int inserir(int valor, int index,  ArrayList*  ArrayList)
{
    // verifica o se existe espaço
    if( ArrayList->tamanho == SIZE)
        dobrarCapacidade( ArrayList);
    if(index < 0 || index >  ArrayList->tamanho)
        return 2; // retorna 2 para indicar erro de índice

    int i =  ArrayList->tamanho; // cria apontador para o final

    while(i != index) // repetição que abre espaço
    {
         ArrayList->elementos[i] =  ArrayList->elementos[i - 1];
        i--; //decrementa o apontador em direção ao índice

    }

     ArrayList->elementos[i] = valor; // coloca o valor no índice
     ArrayList->tamanho++;
    return 0; // retorna 0 para indicar sucesso
}

  • Take a look at the function realloc. https://pubs.opengroup.org/onlinepubs/9699919799/functions/realloc.html

1 answer

-1


As some changes need to be made, I will leave the code with comments before each change I made to get more explanatory.

#include <stdio.h>
// É preciso importar esta biblioteca para usar malloc e free
#include <stdlib.h> 
int SIZE = 5;


struct Lista
{
    int tamanho;
    int* elementos;
};

typedef struct Lista  ArrayList;

void  dobrarCapacidade( ArrayList* ArrayList)
{
    // Aqui o size está sendo duplicado, mas no seu código estava multiplicando SIZE por si mesmo.
    SIZE *= 2; 
    // sizeof(SIZE) quer dizer quanto a variável SIZE ocupa de memória, que é apenas o espaço de um inteiro.
    // Mas como o que você quer na verdade é alocar SIZE * ESPACO_OCUPADO_POR_INTEIRO, a linha a seguir é adequada para isso.
    int* novo = malloc (SIZE*sizeof(int));
    int i;
    for(i = 0; i <= ArrayList->tamanho; i++)
    {
        novo[i] = ArrayList->elementos[i];
    }
    //Não se limpa o tamanho de memória, mas sim o espaço/local que a mesma está armazenada.
    free( ArrayList->elementos);
    ArrayList->elementos = novo;
}



int inserir(int valor, int index,  ArrayList*  ArrayList)
{
    if( ArrayList->tamanho == SIZE)
        dobrarCapacidade( ArrayList);
    if(index < 0 || index >  ArrayList->tamanho)
        return 2;

    int i = ArrayList->tamanho;

    while(i != index)
    {
        ArrayList->elementos[i] = ArrayList->elementos[i - 1];
        i--;

    }

     ArrayList->elementos[i] = valor;
     ArrayList->tamanho++;
    return 0;
}
int main() {
    ArrayList* l = malloc (sizeof(ArrayList));
    l->tamanho = 0;
    l->elementos = malloc (SIZE * sizeof(int));
    inserir(1, 0, l);
    inserir(2, 1, l);
    inserir(3, 2, l);
    inserir(4, 3, l);
    inserir(5, 4, l);
    inserir(6, 5, l);
    inserir(7, 6, l);
    inserir(8, 7, l);
    for(int i = 0; i < l->tamanho; i++) {
        printf("%d\n", l->elementos[i]);
    }
}

It is interesting to note mainly what sizeof means, which can be how much a variable or how much a type of variable occupies in memory.

  • thanks, it helped a lot, but still it was a mistake, I made a change in the rest of my code and get returns to struct*=2

Browser other questions tagged

You are not signed in. Login or sign up in order to post.