André Castro Posted March 14, 2015 at 02:42 PM Report Share #579394 Posted March 14, 2015 at 02:42 PM (edited) 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 March 14, 2015 at 02:47 PM by thoga31 GeSHi Link to comment Share on other sites More sharing options...
HappyHippyHippo Posted March 14, 2015 at 03:17 PM Report Share #579398 Posted March 14, 2015 at 03:17 PM 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 Portugol Plus Link to comment Share on other sites More sharing options...
André Castro Posted March 14, 2015 at 03:23 PM Author Report Share #579399 Posted March 14, 2015 at 03:23 PM (edited) 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 March 14, 2015 at 03:24 PM by André Castro Link to comment Share on other sites More sharing options...
HappyHippyHippo Posted March 14, 2015 at 03:29 PM Report Share #579400 Posted March 14, 2015 at 03:29 PM apresenta o código completo, de outra forma é muito complicado determinar o que se está a passar IRC : sim, é algo que ainda existe >> #p@p Portugol Plus Link to comment Share on other sites More sharing options...
André Castro Posted March 14, 2015 at 05:37 PM Author Report Share #579411 Posted March 14, 2015 at 05:37 PM (edited) #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 March 14, 2015 at 05:51 PM by thoga31 GeSHi Link to comment Share on other sites More sharing options...
HappyHippyHippo Posted March 14, 2015 at 05:58 PM Report Share #579415 Posted March 14, 2015 at 05:58 PM 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 Portugol Plus Link to comment Share on other sites More sharing options...
André Castro Posted March 14, 2015 at 06:54 PM Author Report Share #579433 Posted March 14, 2015 at 06:54 PM ahahah. Vou fazer isso no stackoverflow então... xD Obrigado pela ajuda. Realmente nem eu dei conta do erro. Porque como podes ver tenho o malloc feito como deve de ser para a estrutura Caminho no ultimo for. Já funciona. Agora já posso avançar com isto. Obrigado mais uma vez. 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