Jump to content

Realloc em estrutura


Leudassdf
 Share

Recommended Posts

Boas pessoal,

Eu tenho a seguinte estrutura:

typedef struct teste{
int t;
}inf;
inf *iR;

eu no main fiz iR=calloc(nRedesFicheiro,sizeof(infoRedes));

O problema esta quando quero fazer um realloc. Como é que eu posso realocar espaço nesta estrutura?

Eu pensei em fazer isto. realloc(iR,(nRedesFicheiro+1)*sizeof(infoRedes));

Mas nao funciona. Confeso que ainda nao consegui perceber como se pode realocar espaço na memoria.

Se alguem puder ajudar agradeço

Edited by Leudassdf
Link to comment
Share on other sites

o código que apresentas está correcto (até um certo ponto)

porque dizes que não funciona ?

O problema penso estar no realloc.

Parece que nao está a fazer o que é suposto.

P.ex:

realloc(iR,100*sizeof(inf));
  iR[99].t=9;
  printf("%d", iR[99].t);

o programa diz logo nao responde.

Link to comment
Share on other sites

este é o processo a ser usado no uso do realloc:

// tirei o typedef ...
struct teste {
 int t;
};
struct teste * iR;

// ...

if ((iR = calloc(1, sizeof(struct teste))) == NULL)
 // ERRO

// ...

struct teste * aux = NULL;
int n = 10;

if ((aux = realloc(iR, n * sizeof(struct teste))) == NULL)
 // ERRO

iR = aux;

// ...
Edited by HappyHippyHippo
IRC : sim, é algo que ainda existe >> #p@p
Link to comment
Share on other sites

este é o processo a ser usado no uso do realloc:

Antes de mais obrigado. Vou fazer mais alguns testes mas parece-me que assim funciona.

Gostava que so de perceber o seguinte:

Segundo o documento no link:http://www.cplusplus.com/reference/cstdlib/realloc/

o primeiro argumento da funçao realloc é um ponteiro para um bloco de memoria anteiormente alocado com malloc,calloc.

Mas na pratica para que vai servir esse ponteiro? a minha duvida é se eu so fizer

realloc(iR, n * sizeof(struct teste))

estou a realocar a memoria? Ou a memoria so e realocada quando se faz

iR = aux;
Edited by Leudassdf
Link to comment
Share on other sites

Mas na pratica para que vai servir esse ponteiro? a minha duvida é se eu so fizer

realloc(iR, n * sizeof(struct teste))

estou a realocar a memoria? Ou a memoria so e realocada quando se faz

iR = aux;

a memória é re-alocada na chamada da função realloc.

a variável aux é usada porque se a re-alocação falha, o valor de retorno é o valor NULL, e se atribuires isso a iR, estás a perder o ponteiro original (que não é libertado pelo realloc !!!).

alem disso, o valor de retorno pode ser (nada obriga que) o mesmo valor dado como primeiro parâmetro da chamada, neste caso iR. mas pode ser outro qualquer caso o SO não conseguir reservar a memória no mesmo local.

é por isso que as chamadas ao realloc deverão guardar o valor de retorno numa variável auxiliar e só em caso de sucesso, ser atribuído ao ponteiro original.

nota : em caso de a re-alocação retornar uma posição diferente, a memória original é libertada automaticamente

  • Vote 1
IRC : sim, é algo que ainda existe >> #p@p
Link to comment
Share on other sites

a memória é re-alocada na chamada da função realloc.

a variável aux é usada porque se a re-alocação falha, o valor de retorno é o valor NULL, e se atribuires isso a iR, estás a perder o ponteiro original (que não é libertado pelo realloc !!!).

vamos ver se entendi.

Se eu fizer

n=10000;
realloc(iR, n * sizeof(struct teste))

Isto nao vai realocar a memoria certo?

Teria de fazer se

iR=realloc(iR, n * sizeof(struct teste)) //Aqui é o tal problema de que falas certo? No caso de o realloc falhar vou perder o ponteiro original aqui certo?
Link to comment
Share on other sites

vamos ver se entendi.

Se eu fizer

n=10000;
realloc(iR, n * sizeof(struct teste))

Isto nao vai realocar a memoria certo?

errado.

isso re-aloca a memória.

não está é a guardar o ponteiro para a possível nova posição de memória resultante da operação.

Teria de fazer se

iR=realloc(iR, n * sizeof(struct teste)) //Aqui é o tal problema de que falas certo? No caso de o realloc falhar vou perder o ponteiro original aqui certo?

sim

IRC : sim, é algo que ainda existe >> #p@p
Link to comment
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
 Share

×
×
  • Create New...

Important Information

By using this site you accept our Terms of Use and Privacy Policy. We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue.