2012-04-03 66 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

相关问题