2011-02-14 99 views
0

fgets(myDiscPointer->songArray[0], 21, stdin); 导致我的程序崩溃。我的结构中有以下内容。程序收到信号:“EXC_BAD_ACCESS”

typedef struct 
{ 
char Artist[21]; 
char Album[21]; 
int Year; 
char **songArray; 
}CD; 

,我宣布,发生的事情是,我的#define被Xcode的抱怨以下

CD myDisc; 
CD *myDiscPointer = &myDisc; 

另一件事。

的#define MAXCHARATCERS 21

这被视为未申报时,我用它。

回答

1

如何为songArray分配内存?你需要这样的事情:

#define MAXARTIST 20 
#define MAXALBUM 20 

typedef struct 
{ 
    char Artist[MAXARTIST+1]; 
    char Album[MAXALBUM+1]; 
    int Year; 
    int songs; 
    char **songArray; 
} CD; 

CD *allocCD(char const * const artist, char const * const album, int year) 
{ 
    CD *cd = malloc(sizeof(*cd)); 
    if(!cd) 
     return 0; 

    strncpy(cd->Artist, artist, MAXARTIST); 
    strncpy(cd->Album, album, MAXALBUM); 
    cd->Year = year; 
    cd->songs = 0; 
    cd->songArray = 0; 

    return cd; 
} 

int addSongToCD(CD * const cd, char const * const song) 
{ 
    char **newArray; 
    char *newSong; 

    newSong = malloc(strlen(song)+1); 
    if(!newSong) 
     return 0; 

    strdup(newSong, song); /* strdup uses strlen so malloc(strlen(...)+1) is sufficient, no need for the strndup max length safety net */ 

    newArray = realloc(cd->songArray, sizeof(newArray*) * (cd->songs + 1)); 

    if(!newArray) { 
     free(newSong); /* don't leak memory */ 
     return 0; 
    } 

    cd->songArray = newArray; 
    cd->songArray[cd->songs++] = newSong; 

    return cd->songs; 
} 

void freeCD(CD * const cd) 
{ 
    int i; 
    for(i=0; i < cd->songs; ++i) { 
     free(cd->songArray[i]); 
    } 
    free(cd->songArray); 
} 
+0

不是CD * cd = malloc(sizeof(* cd));只分配足够大的内存给指针? – jarryd 2011-02-14 17:42:58

2

您没有为songArray分配内存,这会导致程序在随机位置写入时崩溃。

0

你以后没有用过MAXCHARACTERS吗?可能是因为错字。

0

关于#define,MAXCHARATCERS似乎是一个排字错误 (最后一个c和t被颠倒过来)。这只是一个错字或者是在你的代码中导致问题的错字?

+0

Typo。谢谢。 ;) – jarryd 2011-02-14 17:45:44

相关问题