Erro malloc [RESOLVIDO]

1. Erro malloc [RESOLVIDO]

ian cléver sales fernandes
ianclever

(usa Arch Linux)

Enviado em 24/08/2013 - 19:24h

Eu estou começando a mexer com ponteiros e alocação dinâmica, o exercício que estou fazendo é alocar 2 vetores dinâmicamente, multiplicá-los e retornar o resultado, o fato é o programa funciona quando os vetores são de até 5 casas depois ele dá o erro:


1: malloc.c:2369: sysmalloc: Assertion `(old_top == (((mbinptr) (((char *) &((av)->bins[((1) - 1) * 2])) - __builtin_offsetof (struct malloc_chunk, fd)))) && old_size == 0) || ((unsigned long) (old_size) >= (unsigned long)((((__builtin_offsetof (struct malloc_chunk, fd_nextsize))+((2 * (sizeof(size_t))) - 1)) & ~((2 * (sizeof(size_t))) - 1))) && ((old_top)->size & 0x1) && ((unsigned long)old_end & pagemask) == 0)' failed.


ele lê todas as entradas, mais ao multiplicar(suponho0 dá esse erro), segue o código:


#include <stdio.h>
#include <stdlib.h>

void mult(int *p,int *p2, int *t)
{
int *p3,c;
p3=malloc(*t*sizeof(int));
for(c=0;c<(*t);c++)
{
p3[c+1]=p[c+1]*p2[c+1];
}
for(c=0;c<(*t);c++)
{
printf("\n%d * %d = %d",p[c+1],p2[c+1],p3[c+1]);
}
free(p3);
}
void main()
{
int tam1,c,*pv1,*pv2;
printf("\nDigite o tamanho dos vetores: ");
scanf("%d",&tam1);
pv1=malloc(tam1*sizeof(int));
pv2=malloc(tam1*sizeof(int));
for(c=0;c<tam1;c++)
{
printf("Digite o %d numero do vetor 1: ",c+1);
scanf("%d",&pv1[c+1]);
printf("Digite o %d numero do vetor 2: ",c+1);
scanf("%d",&pv2[c+1]);
}
mult(pv1,pv2,&tam1);
free(pv1);
free(pv2);
}


alguma idéia do que pode ser?


  


2. MELHOR RESPOSTA

Paulo
paulo1205

(usa Ubuntu)

Enviado em 24/08/2013 - 22:12h

Por que você usou c+1 como índice dos arrays, em lugar de apenas c? Lembre-se que, em C (e C++), um array com N elementos admite como índice os valores que vão de 0 a N-1.

Lembre-se ainda de que o tipo de retorno de main() deve ser int.

Não há necessidade de passar o tamanho à função mult() através de um ponteiro. Não é errado, mas exige mais cuidado e mais digitação, tanto dentro da função como fora. E tudo o que é mais complicado -- especialmente quando essa complicação é desnecessária -- é mais sujeito a bugs (você não errou nessa parte, mas prefira ficar com o que é mais simples).

Para que alocar mais um array dinâmico dentro de mult(), se você não precisa de fato armazenar os valores se quer apenas imprimir o produto? Note que o código abaixo é mais simples e produz a mesmíssima saída (i.e., depois de corrigidos os erros, e trocado o ponteiro desnecessário por inteiro direto).

void mult(int *p,int *p2, int t){
int c;
for(c=0; c<t; c++)
printf("\n%d * %d - %d", p[c], p2[c], p[c]*p2[c]);
}


3. Re: Erro malloc [RESOLVIDO]

wellington
wellingtonsr

(usa Slackware)

Enviado em 24/08/2013 - 19:53h

Eu rodei aqui e não deu erro:


bash-4.2$ ./pont 

Digite o tamanho dos vetores: 3
Digite o 1 numero do vetor 1: 1
Digite o 1 numero do vetor 2: 2
Digite o 2 numero do vetor 1: 3
Digite o 2 numero do vetor 2: 4
Digite o 3 numero do vetor 1: 5
Digite o 3 numero do vetor 2: 6

1 * 2 = 2
3 * 4 = 12
5 * 6 = 30

bash-4.2$



O que eu fiz apenas foi tirar o "void" do main e colocar um int em seu lugar. Coloquei também um "return 0"


4. Re: Erro malloc [RESOLVIDO]

wellington
wellingtonsr

(usa Slackware)

Enviado em 24/08/2013 - 20:00h

Foi mal. Eu testei com 3. Testei agora com 6 e deu erro. :(


5. Re: Erro malloc [RESOLVIDO]

ian cléver sales fernandes
ianclever

(usa Arch Linux)

Enviado em 24/08/2013 - 23:06h

paulo1205 escreveu:

Por que você usou c+1 como índice dos arrays, em lugar de apenas c? Lembre-se que, em C (e C++), um array com N elementos admite como índice os valores que vão de 0 a N-1.

Lembre-se ainda de que o tipo de retorno de main() deve ser int.

Não há necessidade de passar o tamanho à função mult() através de um ponteiro. Não é errado, mas exige mais cuidado e mais digitação, tanto dentro da função como fora. E tudo o que é mais complicado -- especialmente quando essa complicação é desnecessária -- é mais sujeito a bugs (você não errou nessa parte, mas prefira ficar com o que é mais simples).

Para que alocar mais um array dinâmico dentro de mult(), se você não precisa de fato armazenar os valores se quer apenas imprimir o produto? Note que o código abaixo é mais simples e produz a mesmíssima saída (i.e., depois de corrigidos os erros, e trocado o ponteiro desnecessário por inteiro direto).

void mult(int *p,int *p2, int t){
int c;
for(c=0; c<t; c++)
printf("\n%d * %d - %d", p[c], p2[c], p[c]*p2[c]);
}


depois eu vi essa bobeira do c+1, eu já tinha corrigido essa parte mas esqueci de postar, eu sei que era mais simples imprimir mas eu tava tentando pegar uma fórmula mais geral para depois poder portabilizar para programas maiores, aí tava pegando a lógica numa coisa menor para depois praticar em programas maiores, o problema é que com vetor de 6 já ta dando em outros vai complicar. depois vou dar mais uma revisada aqui pra ver o que pode ser.



6. Re: Erro malloc [RESOLVIDO]

ian cléver sales fernandes
ianclever

(usa Arch Linux)

Enviado em 24/08/2013 - 23:20h

gente descobri o que era, testei com um vetor de 10 e funcionou, o problema é que eu estava começando a contagem de índices dos vetores do malloc por 1, como (suponho eu) ele não tem o " \ 0" no final ele sempre estava avançando uma casa para fora da região reservada, com o aumento do tamanho dos vetores isso deve ter ido parar em uma área desconhecida de memória.

o código ficou assim:

#include <stdio.h>
#include <stdlib.h>

void mult(int *p,int *p2, int *t)
{
int *p3,c;
p3=malloc((*t)*sizeof(int));
for(c=0;c<(*t);c++)
{
p3[c]=p[c]*p2[c];
}
for(c=0;c<(*t);c++)
{
printf("\n%d * %d = %d",p[c],p2[c],p3[c]);
}
free(p3);
}
void main()
{
int tam1,c,*pv1,*pv2;
printf("\nDigite o tamanho dos vetores: ");
scanf("%d",&tam1);
pv1=malloc(tam1*sizeof(int));
pv2=malloc(tam1*sizeof(int));
for(c=0;c<tam1;c++)
{
printf("Digite o %d numero do vetor 1: ",c);
scanf("%d",&pv1[c]);
printf("Digite o %d numero do vetor 2: ",c);
scanf("%d",&pv2[c]);
}
system("clear");
mult(pv1,pv2,&tam1);
free(pv1);
free(pv2);
}



7. Re: Erro malloc [RESOLVIDO]

ian cléver sales fernandes
ianclever

(usa Arch Linux)

Enviado em 24/08/2013 - 23:21h

obrigado a todos que ajudaram.






Patrocínio

Site hospedado pelo provedor RedeHost.
Linux banner

Destaques

Artigos

Dicas

Tópicos

Top 10 do mês

Scripts