程序收到信号:“EXC_BAD_ACCESS”

时间:2011-02-14 15:50:20

标签: c

fgets(myDiscPointer->songArray[0], 21, stdin); 导致我的程序崩溃。我的结构中有以下内容。

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

我宣布以下

CD myDisc;
CD *myDiscPointer = &myDisc;

另一件事是我的#define被Xcode抱怨。

  

#define MAXCHARATCERS 21

当我使用它时,这被视为未声明。

4 个答案:

答案 0 :(得分:2)

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

答案 1 :(得分: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);
}

答案 2 :(得分:0)

你之后没有使用MAXCHARACTERS吗?可能是因为拼写错误。

答案 3 :(得分:0)

关于#define,MAXCHARATCERS似乎是一个错字 (最后的c和t是相反的)。这只是一个拼写错误,还是在你的代码中导致问题的拼写错误?