Программа получила сигнал: «EXC_BAD_ACCESS» - PullRequest
0 голосов
/ 14 февраля 2011

Это 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 ]

2 голосов
/ 14 февраля 2011

Вы не выделяете память для songArray, что вызывает сбой программы при записи в случайные места.

1 голос
/ 14 февраля 2011

Где и как вы распределяете память для 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 голосов
/ 14 февраля 2011

Что касается #define, MAXCHARATCERS может показаться опечаткой (последние c и t поменялись местами).Это просто опечатка, или она также вызывает проблемы в вашем коде?

0 голосов
/ 14 февраля 2011

Разве вы не использовали MAXCHARACTERS после? Вероятно, из-за опечатки.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...