Problem mit asprintf



  • Wenn ich mein programm ausfüehre kommt immer folgender fehler:

    *** glibc detected *** ./compare.32: realloc(): invalid next size: 0x080cf210 ***

    Je nach inputfiles die verwendet werden, passiert der fehler nicht immer am gleichen ort, aber immer in der untenstehenden Funktion. Da er etwas von realloc() sagt muss es ein Problem mit asprintf sein... aber ich finde den Fehler einfach nicht....

    Ich hoffe ihr könnt mir helfen.

    void write_statistic(double *** comparison, clustering_result * a, clustering_result * b){
    	char * text;
    	int i;
    
    	asprintf(&text, "%% File %i compared with %i \n\n", first_file_number, first_file_number+1);
    	if(write(fd, text, strlen(text)) <= 0){
    		printf("Nothing written into the Header!\n");
    	}
    	free(text);
    
    	for(i = 0; i < a->number_of_clusters; i++){
    		asprintf(&text, "Cluster %i nearest to Cluster %i, Distance: %.5f\n", i+1, (int)comparison[0][i][0]+1, comparison[0][i][1]);
    		if(write(fd, text, strlen(text)) <= 0){
    			printf("Nothing written into the Header!\n");
    		}
    		free(text);
    
    		if((int)comparison[0][i][2] != -1){
    			asprintf(&text, "but Cluster %i in the same clustering is nearer with distance %.5f\n\n", (int)comparison[0][i][2]+1, comparison[0][i][3]);
    			if(write(fd, text, strlen(text)) <= 0){
    				printf("Nothing written into the Header!\n");
    			}
    			free(text);	
    		}
    		else{
    			if(write(fd, "\n", strlen("\n")) <= 0){
    				printf("Nothing written into the Header!\n");
    			}
    		}
    	}
    
    	asprintf(&text, "\n\n%% File %i compared with %i \n", first_file_number+1, first_file_number);	
    	if(write(fd, text, strlen(text)) <= 0){
    		printf("Nothing written into the Header!\n");
    	}
    	free(text);
    
    	for(i = 0; i < b->number_of_clusters; i++){
    		asprintf(&text, "Cluster %i nearest to Cluster %i, Distance: %.5f\n", i+1, (int)comparison[1][i][0]+1, comparison[1][i][1]
    		if(write(fd, text, strlen(text)) <= 0){
    			perror("Nothing written into the Header!");
    		}
    		free(text);
    
    		if((int)comparison[1][i][2] != -1){
    			printf("Test3\n");
    			asprintf(&text, "but Cluster %i in the same clustering is nearer with distance %.5f\n\n", (int)comparison[1][i][2]+1, comparison[1][i][3]);
    			if(write(fd, text, strlen(text)) <= 0){
    				printf("Nothing written into the Header!\n");
    			}
    			free(text);	
    		}
    		else{
    			if(write(fd, "\n", strlen("\n")) <= 0){
    				printf("Nothing written into the Header!\n");
    			}
    		}
    	}
    	close (fd);
    }
    

    Vielen Dank und Gruss



  • wenn realloc rumspinnt, liegt es wahrscheinlich daran, dass es einen ungültigen pointer bekommen hat, also einen, der nicht von malloc/calloc etc. ausgespuckt, der verändert oder der schon (mit free()) freigegeben wurde.
    🙂



  • Info: Die neue Größe lt. deiner Fehlermeldung entspricht 135066128 Bytes = 128,8 MB

    PS: in deinem Code werden mehrere free nacheinander auf die selbe Variable ausgeführt - könnte auch ungesund werden...

    PPS: als allererstes bitte text NULL setzen! realloc zuliebe. 😉

    char * text = NULL;
    

    mfg (c)h


Anmelden zum Antworten