Ir para o conteúdo
  • Revista PROGRAMAR: Já está disponível a edição #57 da revista programar. Faz já o download aqui!

cskika

malloc

Mensagens Recomendadas

cskika    0
cskika

Olá

Estou a fazer um trabalho e estou a tentar usar memória limitada sem saber quanta memória vou precisa, estava a tentar usar um malloc para um array, e depois numa estrutura mais um mas estou a ter erros de memória, não é possivel usar 2 vezes a malloc? ou qual será a melhor maneira de o fazer?

Obrigado a todos pela ajuda

Cs

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites
pmg    102
pmg

... não é possivel usar 2 vezes a malloc?

Sim, perfeitamente possivel.

Por exemplo

#include <stdlib.h>
int main(void) {
  double *x;
  int *n;

  x = malloc(42 * sizeof *x); /* espaco para 42 doubles */
  if (x == NULL) /* erro */;
  n = malloc(1000 * sizeof *n); /* espaco para 1000 ints */
  if (n == NULL) /* erro */;

  /* ... usa x e n ... */

  free(x);
  free(n);
}

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites
cskika    0
cskika

:wallbash:Pois estou farto de tentar mas não consigo vou ter de fixar um valor para o vector e deixar a malloc para a estrutura.

ao usar as duas coisas com o malloc dá sempre erro no final da execucão! :rant_01:

Eu bem gostava de ter esse sem limite por forma a ocupar apenas a memória necessária!

Muito obrigado pela ajuda aos dois!

Cumprimentos

CS

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites
bubulindo    112
bubulindo

Que tipo de erros?

Como alguém sugeriu, apenas podes usar o malloc uma vez para um determinado bloco de memória. Se precisares de alterar esse bloco, deves usar o realloc.

Como é que a estrutura vai aumentar? Normalmente defines a estrutura no código e não adicionas membros durante o programa. Ou estás a usar um array de estruturas?

E como é que o array vai ser definido? Perguntas no início qual o tamanho do array e defines o tamanho, ou vais aumentado o tamanho à medida que vais precisando de espaco?

Sem mostrar o código, ou o erro que recebes é difícil de "adivinhar" qual o problema.

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites
cskika    0
cskika

Olá

agora pelo menos já estou um pouco melhor!  B) bom então é assim:

o problema é que ao chegar ao final do programa, quando supostamente já está tudo feito

(fui testando com um printf para ver até onde ia) o sistema dá um erro e não sei o porquê,

supostamente depois do printf já não há mais instruções, e se chega até lá é pq já percorreu

as outras  :eek:

quanto ás outras questões por acaso eu tenho o aloc para uma variavel que aumenta de tamanho,

o objectivo é que o utilizador possa inserir a quantidade de valores que quiser, ou seja ele vai aumentando

conforme precisa.

entretanto a olhar novamente e com mais experiencias detectei que ele apenas dá erro se tiver mais de 5 variaveis inseridas!!!

que até a 5 funciona perfeitamente!

a declaração do malloc está assim: *var = (float*) malloc(sizeof(float)*(cont));

*var é o array de valores, o cont é o numero de valores que vão sendo inseridos.

o array está declarado float *var;

será alguma coisa mal na declaração?

Obrigado pela ajuda

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites
bubulindo    112
bubulindo

Isto:

agora pelo menos já estou um pouco melhor!  :cheesygrin: bom então é assim:

o problema é que ao chegar ao final do programa, quando supostamente já está tudo feito

(fui testando com um printf para ver até onde ia) o sistema dá um erro e não sei o porquê,

supostamente depois do printf já não há mais instruções, e se chega até lá é pq já percorreu

as outras  :eek:

Não diz nada. Custa muito meter aqui algo palpável?

Porque não assim:

*var = (float*) malloc(sizeof(float)*cont);

? B)

E porque não chamar o realloc após a primeira inicialização?

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites
bubulindo    112
bubulindo

Quando o prazo para entrega do trabalho terminar, coloca aqui o código e pode ser que fiques a saber o que estava mal. B)

Já agora, um pequeno off-topic... este fórum está escarrapachado para toda a gente, é chato quando se vai pedir ajuda para resolver um trabalho de casa correr o risco de mostrar o trabalho todo aos colegas.

No entanto, existe também uma timestamp a dizer quando foi colocado determinado post. Em caso de problemas com o professor ao haver trabalhos duplicados, quanto mais cedo após a saída do trabalho aparecer aqui o teu código quase completo a pedir ajuda num pormenor, mais possibilidades terás de apresentar o trabalho completo e teres uma prova em como trabalhaste nele em vez de o teres copiado da net.

Mas isso depende de professor para professor e se o professor se vai dar ao trabalho de comparar os programas linha a linha, provavelmente está aqui registado a ver as dificuldades dos alunos. Já falaste com ele para ver se ele te ajuda? Por vezes podes ser surpreendido.

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites
KTachyon    272
KTachyon

E porque não chamar o realloc após a primeira inicialização?

Ou inicializar o ponteiro a NULL e a fazer sempre realloc a partir daí.

o problema é que ao chegar ao final do programa, quando supostamente já está tudo feito

(fui testando com um printf para ver até onde ia) o sistema dá um erro e não sei o porquê,

supostamente depois do printf já não há mais instruções, e se chega até lá é pq já percorreu

as outras  :eek:

Normalmente o erro indica qual é o problema. Outra coisa que ajuda é ler os warnings do compilador.

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites
cskika    0
cskika

em relação á parte do trabalho é isso mesmo eu já penso duas vezes em vir cá não vá ter problemas po causa disso :hmm:

quanto ao compilador ele não dá erros nenhuns antes tivesse!!

aliás mesmo o erro do sistema nada diz!!

vou tentar o realoc para null.

Obrigado a todos  B)

CS

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites
KTachyon    272
KTachyon

Warnings é diferente de erros. Se só houverem warnings o teu programa compila, mas se tiver erros não. Dependendo do compilador que utilizas, existem flags que te mostram os warnings do compilador.

Visto que não mostras o código, a minha última sugestão é utilizares um debugger.

Agora, se o sistema não diz nada, não estou a perceber como é que sabes que o programa dá erro. Aparece alguma janela de erro vazia, ou assim?

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites
SamLapin    0
SamLapin

De certeza que a solução passa por realloc? Queres alocar um espaço e que esse espaço vá crescendo ao longo da execução ou que esse espaço seja logo definido pelo utilizador e não cresça mais?

Evita realloc!! É uma operação muito pesada! Não deve ser utilizada de forma abusiva. Ou melhor, pensa que não a deves usar. Nunca a utilizei e consegui sempre fazer o que me foi proposto B)

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites
KTachyon    272
KTachyon

Sim, o ideal é ter uma estrutura apropriada onde possas inserir novos ponteiros. Por exemplo, se os acessos forem sequenciais, podes usar uma lista ligada onde cada nó tem um ponteiro.

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Crie uma conta ou ligue-se para comentar

Só membros podem comentar

Criar nova conta

Registe para ter uma conta na nossa comunidade. É fácil!

Registar nova conta

Entra

Já tem conta? Inicie sessão aqui.

Entrar Agora


×

Aviso Sobre Cookies

Ao usar este site você aceita a nossa Política de Privacidade