Leudassdf Posted March 18, 2014 Report Share Posted March 18, 2014 (edited) 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 March 18, 2014 by Leudassdf Link to comment Share on other sites More sharing options...
HappyHippyHippo Posted March 18, 2014 Report Share Posted March 18, 2014 o código que apresentas está correcto (até um certo ponto) porque dizes que não funciona ? IRC : sim, é algo que ainda existe >> #p@p Portugol Plus Link to comment Share on other sites More sharing options...
Leudassdf Posted March 18, 2014 Author Report Share Posted March 18, 2014 A estrutura é global o que significa que o realloc deve mesmo realocar a estrutura de forma a que a possa aceder a partir de qualquer funcao. Link to comment Share on other sites More sharing options...
HappyHippyHippo Posted March 18, 2014 Report Share Posted March 18, 2014 primeiro : se tem mesmo de ser global ... segundo : o que é global é o ponteiro e não a estrutura !!! terceiro : não dizes porque razão é que afirmas que o código não funciona ... IRC : sim, é algo que ainda existe >> #p@p Portugol Plus Link to comment Share on other sites More sharing options...
Leudassdf Posted March 18, 2014 Author Report Share Posted March 18, 2014 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 More sharing options...
HappyHippyHippo Posted March 18, 2014 Report Share Posted March 18, 2014 (edited) descodifica o que queres dizer com : o programa diz logo nao responde. ps : pera ai !!!! então não estás guardar o retorno do realloc !!! Edited March 18, 2014 by HappyHippyHippo IRC : sim, é algo que ainda existe >> #p@p Portugol Plus Link to comment Share on other sites More sharing options...
Leudassdf Posted March 18, 2014 Author Report Share Posted March 18, 2014 (edited) descodifica o que queres dizer com : Assim que compila o programa crasha. O windows manda uma mensagem a dizer que o software nao responde. Edited March 18, 2014 by Leudassdf Link to comment Share on other sites More sharing options...
HappyHippyHippo Posted March 18, 2014 Report Share Posted March 18, 2014 (edited) 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 March 18, 2014 by HappyHippyHippo IRC : sim, é algo que ainda existe >> #p@p Portugol Plus Link to comment Share on other sites More sharing options...
Leudassdf Posted March 18, 2014 Author Report Share Posted March 18, 2014 (edited) 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 March 18, 2014 by Leudassdf Link to comment Share on other sites More sharing options...
HappyHippyHippo Posted March 18, 2014 Report Share Posted March 18, 2014 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 1 Report IRC : sim, é algo que ainda existe >> #p@p Portugol Plus Link to comment Share on other sites More sharing options...
Leudassdf Posted March 18, 2014 Author Report Share Posted March 18, 2014 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 More sharing options...
HappyHippyHippo Posted March 18, 2014 Report Share Posted March 18, 2014 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 Portugol Plus Link to comment Share on other sites More sharing options...
Leudassdf Posted March 18, 2014 Author Report Share Posted March 18, 2014 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. sim Ja entendi. Mais uma vez obrigado pela ajuda... Link to comment Share on other sites More sharing options...
Recommended Posts
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 accountSign in
Already have an account? Sign in here.
Sign In Now