Jump to content

SIGABRT erro no malloc


André Castro
 Share

Recommended Posts

Boa tarde.

Estou a tentar resolver um erro para o qual não tenho conhecimentos de como o fazer.

Tenho o seguinte código:

Declaração de estruturas:

typedef struct caminho{
int nCient;
struct caminho *next;
}Caminho;
typedef struct Cientista{
int nCient;
int nSignal;
int profundidade;
int distancia;
struct caminho *next;
} cientista;

Scanfs, criação de vectores leitor e criação de um vector de estruturas bem como seu preenchimento:

scanf("%d %d", &maxCientista, &maxCaminhos);
int leitorA[maxCaminhos];
int leitorB[maxCaminhos];
vectorCientistas = malloc(sizeof(cientista*) * maxCientista);
printf(" %p\n %p\n %p\n %p\n %p\n %p\n %p\n %p\n", vectorCientistas[7], vectorCientistas[6], vectorCientistas[5], vectorCientistas[4], vectorCientistas[3], vectorCientistas[2], vectorCientistas[1], vectorCientistas[0]);
for(i=0; i<maxCientista; i++){            
vectorCientistas[i].nCient = i+1;
vectorCientistas[i].nSignal = 0;
vectorCientistas[i].distancia = 0;
vectorCientistas[i].profundidade = 0;
vectorCientistas[i].next = NULL;
/*printf("//////\nnCient:%d\n nSignal:%d\n distancia:%d\n profundidade:%d\n next:%p\n endereço:%p\n",i, vectorCientistas[i].nCient, vectorCientistas[i].nSignal, vectorCientistas[i].distancia, vectorCientistas[i].profundidade, vectorCientistas[i].next, vectorCientistas[i]);*/
}

O sítio onde me aparece o erro SIGABRT é dentro deste ultimo for quando faço a ultima linha do mesmo.

for(i=0; i<maxCaminhos; i++){
scanf("%d %d", &origem, &destino);
Caminho *temp1;
printf(" %p\n %p\n %p\n %p\n %p\n %p\n %p\n %p\n", vectorCientistas[7], vectorCientistas[6], vectorCientistas[5], vectorCientistas[4], vectorCientistas[3], vectorCientistas[2], vectorCientistas[1], vectorCientistas[0]);
temp1 = (Caminho*) malloc(sizeof(Caminho));
}

1º problema que encontrei através dos printfs, é o facto de em cada printf, o endereço de memória de algumas das casas do vectorCientistas é alterado.

2º problema que encontrei foi que o printf que está em comentário devolve-me null como resultado do endereço de memória que no primeiro printf seria algo como 0x********.

A única coisa parecida com a solução do erro em questão seria apagar o for que preenche as estruturas do vectorCientistas. Claro está que isso resolve-me o erro mas não me é propicio na resolução do projecto escolar que tenho para fazer.

Já pesquisei em vários foruns e disseram-me para usar o valgrind para fazer debug. E confirmei que realmente havia conflitos de memórias, logo assumi que fosse um problema mesmo do meu computador com as .dll.

Eu não sei resolver este problema. Postei aqui isto na esperança de que esta comunidade me possa ensinar como resolver esta questão. Se não fui claro no problema especifico no qual quero ajuda por favor perguntem que eu irei responder assim que puder. Obrigado desde já pela ajuda.

Edited by thoga31
GeSHi
Link to comment
Share on other sites

em nenhum fórum, ninguém foi capaz de perceber estás a obter o endereço do elemento do array de forma errada ???

int* vector;                        // ponteiro
vector = malloc(sizeof(int) * 10);  // alocação de memória capaz de guardar 10 inteiros
printf("%p\n", vector[1]);          // isto não é a posição de memória do segundo elemento do vector !!!
                                   // isto é fazer output do valor guardado no segundo elemento do array assumindo que esse valor é um ponteiro
printf("%p\n", &vector[1]);         // isto sim, é fazer output da posição de memória do segundo elemento do array
IRC : sim, é algo que ainda existe >> #p@p
Link to comment
Share on other sites

wow... devia ter vindo logo aqui. Obrigado. De qualquer maneira o erro persiste. Mas desta vez já bate tudo certo.

8 9

0x11b40b8

0x11b40a0

0x11b4088

0x11b4070

0x11b4058

0x11b4040

0x11b4028

0x11b4010

1

1 2

0x11b40b8

0x11b40a0

0x11b4088

0x11b4070

0x11b4058

0x11b4040

0x11b4028

0x11b4010

cenasecoisas: malloc.c:3096: 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.

O erro do SIGABRT só aparece se fizer com gdb.

Edited by André Castro
Link to comment
Share on other sites

#include <stdio.h>
#include <stdlib.h>
typedef struct caminho{
int nCient;
struct caminho *next;
}Caminho;
typedef struct Cientista{
int nCient;
int nSignal;
int profundidade;
int distancia;
struct caminho *next;
} cientista;

int main(){
int maxCientista;
int maxCaminhos;
int i;
int raizErdos;
int origem;
int destino;
cientista *vectorCientistas;
scanf("%d %d", &maxCientista, &maxCaminhos);
int leitorA[maxCaminhos];
int leitorB[maxCaminhos];
vectorCientistas = malloc(sizeof(cientista*) * maxCientista);
printf(" %p\n %p\n %p\n %p\n %p\n %p\n %p\n %p\n", &vectorCientistas[7], &vectorCientistas[6], &vectorCientistas[5], &vectorCientistas[4], &vectorCientistas[3], &vectorCientistas[2], &vectorCientistas[1], &vectorCientistas[0]);
for(i=0; i<maxCientista; i++){             
 vectorCientistas[i].nCient = i+1;
 vectorCientistas[i].nSignal = 0;
 vectorCientistas[i].distancia = 0;
 vectorCientistas[i].profundidade = 0;
 vectorCientistas[i].next = NULL;
 /*printf("//////\nnCient:%d\n nSignal:%d\n distancia:%d\n profundidade:%d\n next:%p\n endereço:%p\n",i, vectorCientistas[i].nCient, vectorCientistas[i].nSignal, vectorCientistas[i].distancia, vectorCientistas[i].profundidade, vectorCientistas[i].next, vectorCientistas[i]);*/
}
scanf("%d", &raizErdos);
for(i=0; i<maxCaminhos; i++){
 scanf("%d %d", &origem, &destino);
 Caminho *temp1;
 printf(" %p\n %p\n %p\n %p\n %p\n %p\n %p\n %p\n", &vectorCientistas[7], &vectorCientistas[6], &vectorCientistas[5], &vectorCientistas[4], &vectorCientistas[3], &vectorCientistas[2], &vectorCientistas[1], &vectorCientistas[0]);
 temp1 = (Caminho*) malloc(sizeof(Caminho));
}
return 0;
}
Edited by thoga31
GeSHi
Link to comment
Share on other sites

ok ... olhando para o código, e visto que não existe mais nada senão isto, foi fácil determinar onde estava o problema

o problema é que tens a primeira chamada do malloc errada

vectorCientistas = malloc(sizeof(cientista*) * maxCientista);
//                                        A
//                                        |

o problema é que estás a pedir um bloco de memória do tamanho de uma lista de maxCientista * <tamanho de um ponteiro> o que é muito diferente de maxCientista * <tamanho da estrutura cientista>

e como podes verificar, não existe problema em escrever num posição de memória não reservada, mas o que acontece é que a função malloc vai tentar reservar memória na zona que já tinhas escrito quando tentas allocar para os caminhos e, puff, diz que algo de errado se passa.

conclusão : tira lá o asterisco do primeiro malloc, se faz favor.

ps :

- desculpa a demora, estava a tratar de umas cenas

- agora vai a todos os outros foruns que foste antes e diz para irem lavar a cara ...

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.