Por cskika, 5 de Janeiro de 2012 em C
cskika 0
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?
... não é possivel usar 2 vezes a malloc?
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 ... */
: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!
:wallbash:Pois estou farto de tentar mas não consigo ...
Se mostrares o teu codigo fica mais facil ajudar-te.
Se não estás a conseguir também não desistas. Vá, mostra lá o código. B)
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.
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?
agora pelo menos já estou um pouco melhor! bom então é assim:
Não diz nada. Custa muito meter aqui algo palpável?
*var = (float*) malloc(sizeof(float)*cont);
E porque não chamar o realloc após a primeira inicialização?
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.
Ou inicializar o ponteiro a NULL e a fazer sempre realloc a partir daí.
Normalmente o erro indica qual é o problema. Outra coisa que ajuda é ler os warnings do compilador.
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)
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?
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)
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.