2012-04-03 47 views
0

請幫幫我。當我運行這個程序時,我無法弄清楚爲什麼會出現核心轉儲。在返回任何東西之前,我可以打印all_albums_p就好。爲什麼我得到core dumped爲什麼我會傾倒核心?

#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]; 
    } 
} 

錯誤:

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

是隻是我沒有看到你的主要申報number_of_albums()? – 2012-04-03 01:03:32

+1

我也沒有看到album_file的打開。爲了簡潔起見,我假設你忽略了它,但是如果你在尋找錯誤,你需要包含更多,而不是更少。 – 2012-04-03 01:09:15

+0

我沒有複製我的所有代碼。只需使用我的所有代碼進行編輯。 – 2012-04-03 01:09:53

回答

5

你應該低於分配sizeof(char*)代替sizeof(char)
all_albums_p[j].tracks = calloc(all_albums_p[j].num_tracks,sizeof(char*));

+0

謝謝修復了很多我的問題。但爲什麼? – 2012-04-03 01:43:02

+1

char的大小几乎總是8位。在現代系統上,指向char(地址)的指針高達64位。 – Paul 2012-04-03 01:56:26

0

使用調試器或Valgrind的,弄清線路發生問題上。然後你會知道你的代碼的哪一部分是壞的。

+1

不一定。崩潰可能發生在與根本原因不同的地方。 – 2012-04-03 01:02:20

+0

我認爲它是'all_tracks_ptr = parse_album(album_file,number_of_albums);'那是導致問題的原因。 – 2012-04-03 01:02:52

+0

@肯德爾弗雷:是的。在gdb不是的情況下,valgrind通常會有幫助。 – 2012-04-03 01:03:40

1

由於看起來像Unix的消息(「總線錯誤(核心轉儲))我會假設你使用的Unix一番風味。

所以,用調試信息輸出編譯程序開啓,並優化轉向關閉。如果您使用gcc什麼GCC兼容,這將是-g -O0命令行選項。

後運行程序,並讓它崩潰。找到核心轉儲(我將在這個例子中調用它corefile )然後鍵入:

gdb programname corefile 

然後當你得到gdb提示時,鍵入bt(對於backtrace)來查看程序的棧幀。這會告訴你程序崩潰的地方,你可以更仔細地檢查程序的那一部分。


更新:

我覺得你的問題是在這裏:

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

album.tracks被定義爲char**。但是,您分配給all_albums_p[j].tracks的內存塊的大小爲num_trackschar。您需要爲其分配足夠大的內存塊以容納num_trackschar *。所以,你可能需要行更改爲:

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

如何命名corefile。我做了這個>> gcc -o project3 project3.c functions.c -g -O0' – 2012-04-03 01:11:44

+0

默認名稱通常只是'core'。儘管您的系統可能被配置爲使用不同的默認名稱。查看'man core'並查找「核心轉儲文件的命名」部分。無論如何,它應該被轉儲到你運行程序時所在的目錄中(假設你的程序沒有內部地改變當前的工作目錄,我非常懷疑你的目錄)。 – QuantumMechanic 2012-04-03 01:16:43

+0

編輯問題與BT的東西。你能幫我看看嗎?我不知道這些數字是什麼。 – 2012-04-03 01:20:03

相關問題