2012-04-03 14 views
0

Bitte helfen Sie mir. Ich kann nicht herausfinden, warum ich einen Kern bekomme, wenn ich dieses Programm laufen lasse. Bevor ich etwas zurücksende, kann ich all_albums_p prima drucken. Warum bekomme ich core dumped?Warum bekomme ich Core Dump?

#include "music_server.h" 

struct album_ { 
    int num_tracks; 
    char **tracks; 
    int **playlist_hits; 

}; 
typedef struct album_ album; 

album *parse_album(FILE *album_file,int *number_of_albums){ 

    int number_of_album,number_of_tracks,number_of_charaters; 
    int i,j; 
    char dummy_space; 
    int *p; 

    fscanf(album_file,"%d", &number_of_album); 

    *number_of_albums = number_of_album; 

    album *all_albums_p = (album *)malloc(sizeof(album)*number_of_album); 

    for(j=0;j<number_of_album;j++){ 

    fscanf(album_file,"%d", &all_albums_p[j].num_tracks); 

    all_albums_p[j].tracks = calloc(all_albums_p[j].num_tracks,sizeof(char)); 
    all_albums_p[j].playlist_hits = calloc(all_albums_p[j].num_tracks,sizeof(int)); 

    /*Line 27*/ for(i=0;i<all_albums_p[j].num_tracks;i++){ 

     fscanf(album_file,"%d", &number_of_charaters); 

     all_albums_p[j].tracks[i] = (char *)calloc(number_of_charaters+1,sizeof(char)); 
     all_albums_p[j].playlist_hits[i] = (int *)malloc(sizeof(int)); 
     all_albums_p[j].playlist_hits[i] = 0; 
     fscanf(album_file," ",dummy_space); 
     fscanf(album_file, "%[^\n]s", all_albums_p[j].tracks[i]); 
    } 
    } 
    return all_albums_p; 
} 

main(int argc, char *argv[]){ 

    int i,j; 
    int *number_of_albums,*number_of_tracks,a; 
    a=0; 
    number_of_albums = &a; 

    album *all_tracks_ptr; 

    album_file = fopen(argv[1],"r"); 
    transaction_file = fopen(argv[2],"r"); 

    if((album_file == NULL) || (transaction_file == NULL)){ 
    printf("Either %s or %s could not be open"); 
    }else{ 

    all_tracks_ptr = parse_album(album_file,number_of_albums); 


    int number_of_tracks[*number_of_albums]; 
    } 
} 

Fehler:

Bus Error (core dumped)

(gdb) bt 
#0 0xff277c9c in _smalloc() from /lib/libc.so.1 
#1 0xff277d10 in malloc() from /lib/libc.so.1 
#2 0xff263830 in calloc() from /lib/libc.so.1 
#3 0x00010dd8 in parse_album (album_file=0xff3675bc, 
    number_of_albums=0xffbff894) at functions.c:27 
#4 0x00010b80 in main (argc=3, argv=0xffbff90c) at project3.c:19 
+0

ist, ist ich zuteiles sollen nur die nicht Ihre number_of_albums Erklärung in Haupt sehen()? –

+1

Ich sehe auch nicht das Öffnen von Album_Datei. Ich nehme an, Sie haben es der Kürze halber weggelassen, aber wenn Sie nach Fehlern suchen, müssen Sie mehr und nicht weniger einbeziehen. –

+0

Ich habe nicht meinen gesamten Code kopiert. Bearbeiten Sie es einfach mit meinem ganzen Code. –

Antwort

5

Sie sizeof(char*) unten statt sizeof(char)
all_albums_p[j].tracks = calloc(all_albums_p[j].num_tracks,sizeof(char*));

+0

Danke, das hat viele meiner Probleme behoben. Aber warum? –

+1

Die Größe eines Char ist fast immer 8 Bit. Ein Zeiger auf ein Zeichen (eine Adresse) ist bei modernen Systemen bis zu 64 Bits lang. – Paul

0

Verwenden Sie einen Debugger oder valgrind und herauszufinden, was die Linie das Problem auf auftritt. Dann werden Sie wissen, welcher Teil Ihres Codes schlecht ist.

+1

Nicht unbedingt. Abstürze können an sehr unterschiedlichen Stellen auftreten als ihre Ursache. –

+0

Ich denke es ist 'all_tracks_ptr = parse_album (album_file, number_of_albums);' das verursacht das Problem. –

+0

@KendallFrey: True. Häufig ist Valgrind in solchen Fällen hilfreich, wenn gdb nicht ist. –

1

Da das wie eine Nachricht Unix sieht ("Bus Error (core dumped)) Ich werde annehmen, dass Sie einige Geschmack von Unix verwenden.

So kompilieren Ihr Programm mit Debug-Informationen Ausgabe eingeschaltet und mit der Optimierung gedreht ab. Wenn Sie gcc oder etwas gcc-kompatibel verwenden, das wäre die -g -O0 Befehlszeilenoptionen.

Dann wird Ihr Programm ausführen und hat es zum Absturz bringen. den Core-Dump liegen (ich werde corefile in diesem Beispiel nennen) und geben dann ein:

gdb programname corefile 

Wenn Sie die gdb-Eingabeaufforderung erhalten, geben Sie bt (für backtrace) ein, um den Stackframe des Programms anzuzeigen. Das wird Ihnen sagen, wo das Programm abgestürzt ist und Sie können diesen Teil Ihres Programms genauer untersuchen.


Update:

Ich denke, Ihr Problem hier ist:

all_albums_p[j].tracks = calloc(all_albums_p[j].num_tracks,sizeof(char)); 

album.tracks als char** definiert. Was Sie jedoch all_albums_p[j].tracks zuweisen, ist ein Speicherblock der Größe num_trackschar. Sie müssen ihm einen Speicherblock zuweisen, der groß genug ist, um num_trackschar * zu enthalten. So müssen Sie wahrscheinlich die Linie ändern:

all_albums_p[j].tracks = (char **) calloc(all_albums_p[j].num_tracks,sizeof(char *)); 
+0

Wie kann ich Corefile benennen? Ich habe das gemacht >> 'gcc -o project3 project3.c functions.c -g -O0' –

+0

Der Standardname ist oft einfach' core'. Obwohl Ihr System möglicherweise so konfiguriert ist, dass es einen anderen Standardnamen verwendet.Siehe 'man core' und suche nach einem Abschnitt wie" Benennung von Core-Dump-Dateien ". In jedem Fall sollte es in dem Verzeichnis abgelegt werden, in dem Sie sich befanden, als Sie das Programm ausgeführt haben (vorausgesetzt, Ihr Programm ändert intern nicht das aktuelle Arbeitsverzeichnis, woran ich sehr zweifle.) – QuantumMechanic

+0

editierte Frage mit dem BT-Ding. Kannst du mir helfen, einen Blick darauf zu werfen? Ich habe keine Ahnung was die Zahlen sind. –

Verwandte Themen